2017-01-03 4 views
7

У меня есть этот список с 5 последовательностью чисел:Как рассчитать процент каждого элемента в списке?

['123', '134', '234', '214', '223'] 

, и я хочу, чтобы получить процент от каждого числа 1, 2, 3, 4 в ith положения каждой последовательности чисел. Например, цифры в 0th позиции этого 5 последовательностей чисел: 1 1 2 2 2, тогда мне нужно рассчитать процент от 1, 2, 3, 4 в этой последовательности номеров и вернуть проценты как 0th элемент нового списка.

['123', '134', '234', '214', '223'] 

0th position: 1 1 2 2 2 the percentage of 1,2,3,4 are respectively: [0.4, 0.6, 0.0, 0.0] 

1th position: 2 3 3 1 2 the percentage of 1,2,3,4 are respectively: [0.2, 0.4, 0.4, 0.0] 

2th position: 3 4 4 4 3 the percentage of 1,2,3,4 are respectively: [0.0, 0.0, 0.4, 0.6]] 

Затем желаемый результат для возврата:

[[0.4, 0.6, 0.0, 0.0], [0.2, 0.4, 0.4, 0.0], [0.0, 0.0, 0.4, 0.6]] 

Моей попытки до сих пор:

list(zip(*['123', '134', '234', '214', '223'])) 

Результат:

[('1', '1', '2', '2', '2'), ('2', '3', '3', '1', '2'), ('3', '4', '4', '4', '3')] 

Но я застрял здесь, то я не знаю, как рассчитать процентное соотношение nt каждого номера 1, 2, 3, 4, затем получите желаемый результат. Любое предложение приветствуется!

ответ

0

Вы можете использовать count(i), чтобы определить, к числу вхождений числа 1-4 и разделить его на 5, чтобы получить процент:

sequence=list(zip(*['123', '134', '234', '214', '223'])) 
percentages=[] 
for x in sequence: 
    t=list(x) 
    temp=[t.count(str(i))/len(x) for i in range(1,5)] #work out the percentage of each number 
    percentages.append(temp) #add percentages to list 

Или, как один список понимания:

percentages=[[list(x).count(str(i))/len(x) for i in range(1,5)]for x in sequence] 

Выход:

[[0.4, 0.6, 0.0, 0.0], [0.2, 0.4, 0.4, 0.0], [0.0, 0.0, 0.4, 0.6]] 
+1

Слишком много жесткого кодирования. '/ 5' следует заменить на'/len (x) ', а' range (1,5) 'следует заменить на' set (''. Join (l)) '(и вы можете заменить' str (i) 'только с' i'). – BallpointBen

3

Начиная с вашего подхода, вы можете сделать все остальное с помощью Counter

from collections import Counter 

for item in zip(*['123', '134', '234', '214', '223']): 
    c = Counter(item) 
    total = sum(c.values()) 
    percent = {key: value/total for key, value in c.items()} 
    print(percent) 

    # convert to list 
    percent_list = [percent.get(str(i), 0.0) for i in range(5)] 
    print(percent_list) 

который печатает

{'2': 0.6, '1': 0.4} 
[0.0, 0.4, 0.6, 0.0, 0.0] 
{'2': 0.4, '3': 0.4, '1': 0.2} 
[0.0, 0.2, 0.4, 0.4, 0.0] 
{'4': 0.6, '3': 0.4} 
[0.0, 0.0, 0.0, 0.4, 0.6] 
2

Вы могли бы начать с создания архивный список, как вы делали:

zipped = zip(*l) 

затем сопоставить itertools.Counter к нему, чтобы получить отсчеты каждого элемента в итогах от zip:

counts = map(Counter, zipped) 

, а затем пройти через него, создавая список из их подсчетов делится своими размерами:

res = [[c[i]/sum(c.values()) for i in '1234'] for c in counts] 
print(res) 
[[0.4, 0.6, 0.0, 0.0], [0.2, 0.4, 0.4, 0.0], [0.0, 0.0, 0.4, 0.6]] 

Если вы один вкладыш такой человек, Муше первые два в понимании, чтобы получить это в одна строка:

res = [[c[i]/sum(c.values()) for i in '1234'] for c in map(Counter, zip(*l))] 

дополнительно, как было отмечено в комментарии, если вы не знаете, элементы загодя, sorted(set(''.join(l))) может заменить '1234'.

+2

Если вы не знаете элементов раньше времени, 'set (''. Join (l))' следует заменить ''1234''. – BallpointBen

+0

@Jim Fasarakis-Hilliard Спасибо за ваше решение, но я не очень понимаю этот синтаксис '[[c [i]/sum (c.values ​​()) для i в '1234'] для c в карте (Counter, zip (* l))], потому что я не очень хорошо знаком с функцией «map». Я проверил и узнал, что это может означать применение функции 'Counter' на' zip (* l)) ', тогда я подумал, почему не использовать напрямую' Counter (zip (* l)) ', но я нашел' Counter (zip (* l)) 'не работает. Затем я проверил и нашел «map (Counter, zip (* l))' возвращает '<объект карты в 0x033C1930>'. Я не знаю, что это значит. Не могли бы вы объяснить мне, почему работает 'map (Counter, zip (* l))'? Спасибо. –