2011-09-22 7 views
1

저는 파이썬을 배우는 중입니다. 언어를 배우는 가장 좋은 방법은이 언어를 사용하는 것입니다. 따라서 이진 단어를 비교하여 회색이 무엇인지 판별하는 스크립트를 만들 것입니다.이진 문자열 비교

한 비트가 다른 경우 이진 코드가 어떤 숫자인지 기록해야합니다. 예를 들어 N = 3이면 이진 코드는 000, 001, 010, 011, 100, 101, 110, 111입니다.

첫 번째 이진 코드를 010으로 선택한 경우 코드는 110을 반환해야합니다. 000, 011, 또는 바람직하게는 인덱스 0, 3, 6 (또는 1,4,7)이다.

이 작업을 수행하는 가장 좋은 파이썬 방법은 무엇

이 주로 나는 가장 빠른 코드를 목표로하고 있습니다 :

내 질문은 이것이다.

제 생각에는 여러분 중 일부는이 작업을 수행하는 최적의 방법에 대해 더 좋은 아이디어를 가지고있을 것입니다. 그러면 제 코드를이 코드와 비교하면 훨씬 더 많이 가르쳐 줄 수 있습니다.

+0

(I가 일치하지 않는 비트 수를 retrun 할 필요)를 반환 멀리? 먼저 코드를 작성하고 테스트 한 다음 작동하지 않으면 개선 할 부분을 찾아야합니다. 일단 완료되면 최적화를 생각하십시오. 좋은 코드 샘플을보고 싶다면 github이나 요리 책 사이트를 통해 사람들이 파이썬의 일반적인 문제를 어떻게 해결하는지 확인하십시오. http://code.activestate.com/recipes/langs/python/ – Lostsoul

답변

2

이것은 이진 계산 문제이므로 (기묘한 입력과 함께) 실제로 발전기, 목록 보급 및 itertools와 같은 도구 pythonic을 적용 할 수있는 영역이 아닙니다. 당신은 출력 (즉 0,3,6 대신 6,0,3의) 정렬 할, 사용을 원하는 경우에

def neighbors(code, N=3): 
    num = int(code, 2) 
    return [num^(1 << (N-i-1)) for i in range(N)] 

는 :

def neighbors_sorted(code, N=3): 
    num = int(code, 2) 
    return sorted(num^(1 << i) for i in range(N)) 
0

나는 첫 번째 답변으로 내 초기 시도를 게시하고 싶어하지만 웹 사이트의 주위에 저를 차단 8 시간 만에 지금은 대답 할 수있었습니다. 나는 코드를 더 중요한 발췌 문장으로 분할했다.

나는 아래의 코드에 다음 개조를 수행해야한다고 생각 :

다음과 같이 이진수의 목록을 작성하는 나의 시도는

(사용하지

1) Use dicts so that I have 0:000,1:001,... to improve the indexing. 
    2) Take the comparison string, adapt it to a list of all possible options 
     then compare this to the full binary list e.g. 010 becomes 110,000,011 
     and this is then is compared to the full binary list. 
이 지금까지 내 시도

def BinaryNumberList(N=4): 
Bins=[] 
for Num in range(2**N): 
Bin='' 
for Pow in sorted(range(N),reverse=True): 
    Bin=Bin+str(Num/(2**Pow)) 
    Num=Num-Num/(2**Pow)*2**Pow 
    Bins.append(Bin) 
return Bins 

그런 다음 현재 (나머지 행 가장 일)

0123를 각각의 문자열을하지 비교 루프를 실행) 아직 dicts
def GreySets(Bins): 
for Bin1 in Bins : 
    for Bin2 in Bins : 
    stringXOR(Bin1,Bin2) 

내가 인터 웹에 몇 가지 중 하나를 elses 코드에서 가져온 문자열 XOR과는 TrueFalseTrue 그렇게 시도 무엇

def stringXOR(a, b): 
# Error Checking 
msg = "Strings do not have same length: %d, %d!" 
assert len(a) == len(b), msg % (len(a), len(b)) 
cnt = len(a) - 1 
# Code 
result = '' 
while cnt + 1: 
    result = `(a[cnt] != b[cnt])` + result 
    cnt = cnt - 1 
return result 
+0

이것은 훨씬 복잡합니다. 왜 내가 "개조"를 구현해야하는지 아무 이유도 보이지 않는다. 나는 내 자신의 경적을 여기에 투척하지만, 왜 코드가 [내 두 개의 라이너] (http://stackoverflow.com/questions/7511476/binary-string-comparison/7511608#7511608)보다 나은가? – phihag

+0

안녕하세요, 나는 어떤 범죄도 의미하지 않았고, LostSould에 대한 응답으로 내 n00b 코드를 게시 했으므로 지금 귀하의 항목 만 보았습니다. 그것은 빛나 : D 조 – Carel