2016-04-14 5 views
0

мне нужно пробежать список кортежей, как это:Запуск через список кортежей

list = [('Abraham', 'Lisboa', 42195, '10-18', 2224), 
('Mike', 'Nova Iorque', 42195, '06-13', 2319), 
('Abraham', 'Toquio', 42195, '02-22', 2403), 
('Mike', 'Sao Paulo', 21098, '04-12', 1182), 
('Abraham', 'Sao Paulo', 21098, '04-12', 1096), 
('Dora', 'Toquio', 42195, '02-22', 2449), 
('Abraham', 'Boston', 42195, '04-20', 2187)] 

Моей функции (участия) должно проходить через эти кортежи и подсчитать, сколько раз делаю первый элемент из в общем случае встречаются кортежи. Например:

participations(list) 
>>>[4, 1, 2] 

4 является число раз, что элемент «Авраам» происходит, 1 число раз элемент «Дора» происходит, и 2 число раз, элемент «Mike» происходит , Участие в окончательном списке должно быть в алфавитном порядке, следуя указанным именам.

Вот то, что я до сих пор:

def participations(list): 
result = [] 
for i in list: 
    for name in i[0]: 
     result.append(name) 
return result 

Но это не дает мне то, что я хочу, это только дает мне имена с каждой буквой, отделенные друг от друга ...

Смело задавать любые вопросы, если вы не понимаете мою.

Надеюсь, вы, ребята, можете мне помочь, спасибо заранее.

+2

Вам не нужно второй 'for' цикл - просто сделать' result.append (я [0]) '. Кроме того, постарайтесь не называть переменные 'list', поскольку они теневые встроенные. – tzaman

+0

Спасибо! У меня есть список с именами сейчас, но как я могу подсчитать, сколько раз они происходят? – Stagg

+0

Слово 'list' является ключевым словом в python. Целесообразно использовать другое имя переменной, чтобы назвать ваш список. – Vasanth

ответ

0

Нет импорта - только одну строку списка непониманием :)

lst = [('Abraham', 'Lisboa', 42195, '10-18', 2224), 
('Mike', 'Nova Iorque', 42195, '06-13', 2319), 
('Abraham', 'Toquio', 42195, '02-22', 2403), 
('Mike', 'Sao Paulo', 21098, '04-12', 1182), 
('Abraham', 'Sao Paulo', 21098, '04-12', 1096), 
('Dora', 'Toquio', 42195, '02-22', 2449), 
('Abraham', 'Boston', 42195, '04-20', 2187)] 

[[y[0] for y in lst].count(z) for z in sorted(set([t[0] for t in lst]))] 

Python 2.7.6 переводчика:

>>> [[y[0] for y in lst].count(z) for z in sorted(set([t[0] for t in lst]))] 
[4, 1, 2] 
>>> 

Если вы хотите посчитать количество вхождений первого элемента в весь кортеж (в отличие от только учитывая первый элемент):

[[x for y in lst for x in y].count(z) for z in sorted(set([t[0] for t in lst]))] 
+0

Ваша реализация в настоящее время будет отсчитывать появление первого элемента в кортеже из всего кортежа. Это не удастся для '('Даллас', 'Даллас', ...)' например. Возможно, это не проблема для плаката, но все-таки сломанное решение, если только на самом деле это не был плакат. Вопрос оставил это немного расплывчатым. –

+0

@Ilja * «Вопрос оставил это немного неопределенным» * Да, я не знал точно, что это за намерение, но теперь я упростил его, чтобы считать только первые элементы. Предыдущая версия, которая рассматривает все элементы в каждом кортеже, является более длинной версией в нижней части моего ответа – jDo

3

Counting лучше всего сделать Counter в питоне:

from collections import Counter 
from operator import itemgetter 

data = [('Abraham', 'Lisboa', 42195, '10-18', 2224), 
('Mike', 'Nova Iorque', 42195, '06-13', 2319), 
('Abraham', 'Toquio', 42195, '02-22', 2403), 
('Mike', 'Sao Paulo', 21098, '04-12', 1182), 
('Abraham', 'Sao Paulo', 21098, '04-12', 1096), 
('Dora', 'Toquio', 42195, '02-22', 2449), 
('Abraham', 'Boston', 42195, '04-20', 2187)] 

def participations(data): 
    # You could use a generator expression too instead of a map: 
    # Counter(d[0] for d in data) 
    counts = Counter(map(itemgetter(0), data)) 
    return [counts[k] for k in sorted(counts.keys())] 

print(participations(data)) 
[4, 1, 2] 
+0

Есть ли способ сделать это без функции высокого порядка? Извините, но я новичок в python, и я еще не совсем понял этот код. Спасибо :) – Stagg

+0

Просто добавил комментарий, описывающий именно это. –

+0

Я получаю это сейчас, большое спасибо :) – Stagg

Смежные вопросы