2016-10-30 4 views
-2

다음과 같은 문제가 있습니다.목록의 특정 문자 수

['-0---110', '--1--110', '01---100', '1--101-0', '10-1-100',...., '10100010'] 

가 지금은 문자열 0, 1, 2, 3, ... 막대 발생합니까 얼마나 자주 알고 싶어 : 내 코드에서 나는 한 점은 다음 예제와 유사 않는 목록을 얻고있다 . 쉬운 방법이 있나요?

편집 : 나는 ['-0---110', '--1--110', '01---100', '1--101-0', '10-1-100',...., '10100010'].count(-)과 같이 작동해야한다고 생각하지만,하지 않습니다

Edit2가 : 또한 작동하는 것 같다 내 두 번째 시도는 다음과 같습니다

barcounter = numpy.zeros(8) 
for x in range(len(list)): 
    rankcounter[8-1-list[x].count("-")] += 1 
print("barcounter", barcounter) 
+4

예. 지금까지 뭐 해봤 어? 시도를 보여줄 수 있습니까? – idjaw

+2

리스트에는'count' 메소드가 없습니다. 문자열은 않습니다. 목록의 항목을 반복하고 거기에'count'를 적용하십시오. 그것의 쉬운. 또한 당신은 술집을 인용해야합니다. –

+0

아 좋아, 그게 도움이 될거야 :) – HighwayJohn

답변

1

당신이 가고 있었는지의 감각을 얻을 for,하지만 당신은 목록을 통해 반복해야합니다.

from collections import defaultdict 

def get_bar_freq(bar_list): 
    bar_freq = defaultdict(int)  # a dictionary that will keep track of frequencies 
    for word in bar_list: 
     num_bars = word.count('-') 
     bar_freq[num_bars] += 1  # increment freq of this many num_bars 
    return bar_freq 


def main(): 
    bar_list = ['-0---110', '--1--110', '01---100', '1--101-0', '10-1-100', '10100010'] 
    print(get_bar_freq(bar_list)) 

if __name__ == '__main__': 
    main() 

이 출력 : 그것은 즉 defaultdict(<class 'int'>, {0: 1, 2: 1, 3: 2, 4: 2}) 1 개 문자열이 0 바를 포함 말하고, 1 개 문자열이 포함 된 다음 많은 바는 문자열에 나타난의 주파수로 바의 수에서 사전 매핑을 반환하는 솔루션입니다 바, 2 개의 현에는 3 개의 바가 있고 2 개의 현에는 4 개의 바가 포함되어 있습니다.

여기에서 무슨 일이 벌어지고 있는지 이해하고 나면 더 많은 Pythonic (그리고 더 나은) 방법을보고 싶다면 다른 대답을 확인하십시오. 이 솔루션에서 기본적으로 bar_freq 사전의 기능을 제공하는 collections.counter을 사용할 수 있습니다.

+0

아 정말 고마워, 정말 좋은 솔루션입니다! – HighwayJohn

+1

카운터가 이것에 더 적합하며 하나의 라이너가됩니다. 예를 들어'Counter (w_count ("-") bar_list의 w에 대해) – Copperfield

+0

@Copperfield 나는 진심으로 동의합니다. 그러나 나는 그것이 사람들이 무슨 일이 일어나고 있는지 보는 것이 더 낫다는 것을 교육학적인 것으로 알고 있습니다. 나는 누군가를 위해 일하는 계약 된 코드 원숭이 코드가 아니다. 나는 그들이 배우는 것을 돕기 위해 여기에있다. 그리고 1 개의 라이너가 항상 그것을하는 길이 아니다. 그럼에도 불구하고 마지막에 하나의 라이너를 참조로 추가하겠습니다. 감사합니다. (y) – gowrath

2

실제로 collections.Counter을 사용할 수 있습니다 2.7 이상 파이썬이있는 경우 :

from collections import Counter 

def get_bar_freq(bar_list): 
    return Counter(entry.count('-') for entry in bar_list) 

을 우리의 경우에 값이 반복 가능한 나타나는 빈도 Counter 계산됩니다. 적당한 반복자를 얻으려면, 우리가 세고 싶은 것이 무엇이든 목록을 가져와야합니다. 이 경우 문자열에 포함 된 "막대"의 수입니다.

결과이 같은 것입니다 :

Counter({3: 2, 4: 2, 0: 1, 2: 1}) 
+0

아,이게 내가 찾고 있었던거야. 감사합니다 :) 내 간단한 시도보다 훨씬 짧습니다. – HighwayJohn