2013-05-15 4 views
0

사전을 테스트하여 부분 문자열이 포함 된 키가 있는지 확인하려고합니다. 특히, 각 깃털의 제어를 사전에 할당하는 날개 생성기를 구축 중입니다. 버튼을 클릭하여 날개를 미러링하려면 날개가 이미 미러링되었는지 테스트해야합니다. (그리고 나서 이후에 실행 취소되었거나 삭제되었지만이 질문의 일부가 아니며 쉽게 테스트됩니다.) 깃털 사전에서 "L_"과 "R_"이 모두 포함 된 키가 있는지 확인하여이 작업을 수행하려고합니다.사전에 여러 부분 문자열이 포함 된 키가 포함되어 있습니까?

다음 코드는 내가 원하는 것은 수행하지만 오히려 자세한 내용입니다. 그것을 할 수있는 간단하고, 더 우아한 방법이있을 가지고있다 : 또는

dict={} 
RS=False 
LS=False 
for each in dict: 
    if "L_" in each: 
     LS=True 
    if "R_" in dict: 
     LS=True 
if LS and RS: 
    print "has both" 

, 그냥 테스트하는 것을에 미러 참/거짓 값을 다른 전역 변수를 생성하고 저장하는 간단한 것입니까? 내 전역 변수를 최소한으로 유지하려고하지만 리소스에 어떤 영향을 미치는지는 불확실하다. 어떤 조언을 주시면 감사하겠습니다.

+0

코드가 원하는대로 작동합니까? 나는 각각의 경우에''R_''을 의미한다고 생각하고'RS = True' 대신'LS = True'를 반복합니다. 또한 루프 안에 'LS와 RS : if if'가 있습니까? 그렇다면 LS와 RS를 매 반복마다 False로 재설정 할 필요가 없습니까? 코드를 작동 시키면 여기 사람들이 코드를 더 잘 만들 수있는 방법을 더 쉽게 보여줄 수 있습니다. –

답변

1

이 방법은 덜 장황하며 일치하는 키가 발견되면 검색을 일찍 중단 할 수 있지만 최악의 경우 키를 두 번 완전히 통과시킵니다.

if any('L_' in key for key in dict) and any('R_' in key for key in dict): 
    print 'has both' 

참고 : 같은 키에 표시 L_R_을 찾고 여부 (: "...L_...R_..." 예를 들어)하는 경우가 귀하의 질문에 조금 모호합니다.

if any('L_' in key and 'R_' in key for key in dict): 
    print 'has both' 

이 방법은 더 자세한이지만, 가능한 한 빨리 발발하고, 하나는 최악의 경우도 통과한다 : 그런 경우 사용합니다. 당신은 내가 당신이 당신의 사전에 많은 키가있는 경우 최적화를해야, 만 최악의 경우 하나 개의 패스가 도움이 될 것입니다 만드는 경우에 따라 가정 사용

RS=False 
LS=False 
for each in dict: 
    if "L_" in each: 
     LS=True 
    if "R_" in dict: 
     RS=True 
    if LS and RS: 
     print 'has both' 
     break 

.

+0

감사합니다. 내가 두 번째 옵션에서 멀리 떨어져있는 것은 아니지만 덜 구체적인 방법은 잘 알고있는 것이 좋습니다. 매우 감사. – Kratch

0

처음에 사전을 만들 때 두 가지 사전이 있습니다. 오른쪽 사전에 값을 입력하십시오 (둘 다 설명이있을 수 있음). 사실, 두 사전을 가져라.

그런 다음이 검색 문제가 발생하지 않습니다.

+0

각 페더를 개별적으로 작성하는 별도의 메소드를 사용하여 깃털 (가변 개수의 깃털 수)을 작성한 다음 제어 이름을 사전에 할당하십시오. 거울을 칠할 때 반대쪽 측면 사전의 길이에 따라 깃털 값이 # 같은 방식으로 실행됩니다 (새 측면의 각 컨트롤을 통해 실행되고 반대쪽의 깃털 컨트롤에서 특성을 복사 함). 양면을 만드는 것과 같은 방법이기 때문에 동일한 사전을 사용합니다. 따라서 두 번째 깃털 사전이 실용적인지, 아니면 "미러 테스트"전역 변수보다 나은지 잘 모르겠습니다. – Kratch

+0

@Kratch 이것은 정말로 그렇다면 측면을 분리하지 않아야하는 것처럼 들립니다. 나는 당신의 설명이 더 적합한 데이터 구조를 추천하기에는 너무 모호하다는 것을 알지만, 나는 그럴 것이라고 확신한다. – Marcin

0

당신이 당신의 클래스에 따라 깃털을 분류하는 기능을 구축 할 수있는 더 많은 기능 스타일을 사용하려면 :

def classify(s): 
    return set(['L']) if 'L_' in s else set(['R']) 
이 이

그리고 단지 당신의 키에 감소 적용

wing = {'L_feather': 6 , 'R_feather' : 5} 
reduce(lambda x, y: classify(x) | classify(y), wing) 

결과 두 세트를 모두 포함하는 세트에서 .issubset() 또는 liss()로 쉽게 확인할 수 있습니다.

Out[30]: 
set(['R', 'L']) 

이것은 한 번만 목록을 횡단해야합니다.

관련 문제