2016-01-21 1 views
0

У меня есть два списка, упрощенные как таковые, с элементами, которые являются отдельными цифрами, пожалуйста, представьте, что каждый элемент в alist является номером телефона, и каждый элемент в blist представляет собой количество секунд их вызова. Я уверен, если это делает разницу, но я хочу быть как можно более конкретным:Python, как мы объединяем два списка с определенным форматом, а затем суммируем как элементы?

alist = [1,4,1,2,1] 
blist = [6,7,8,9,5] 

, и я хотел бы подвести элементы в Blist, которые имеют один и тот же Int в ALIST, также он должен быть в числовом порядок согласно alist. Вывод должен выглядеть следующим образом:

clist = [19,9,7] 

Я попытался с помощью:

clist = [a + b for a, b in zip(alist, blist)] 

объединить списки, то, возможно, подводя его после того, как, но это, кажется, становится все труднее. Есть ли более простой способ?

+0

Ожидаете ли вы сортировка для того, чтобы быть 1,4,2, который является порядком они появились в ALIST или численно 1,2,4? – SirParselot

+0

@SirParselot - Я думаю, что это 1,2,4, идя по упоминанию «числового порядка» и результата «[19, 9, 7]» (и игнорируя упоминание «по алисту»). – TigerhawkT3

+0

@SirParselot Поздний ответ, но Тигр был прав, он должен быть 1,2,4 – LeBlanc

ответ

1

Вот идея с использованием словаря, чтобы отобразить элементы alist к сумме соответствующих элементов blist.

>>> alist = [1,4,1,2,1] 
>>> blist = [6,7,8,9,5] 
>>> d = {} 
>>> for a,b in zip(alist, blist): 
...  d[a] = d.get(a, 0) + b 
... 
>>> [d[x] for x in sorted(d)] 
[19, 9, 7] 
+0

Интересно, будет ли '[d [x] для x в отсортированном (d)]' быстрее или понятнее? – TigerhawkT3

+0

@ TigerhawkT3 Я думаю, что ваша идея лучше читается, я ее отредактирую. – timgeb

+0

Именно это я и надеялся. Спасибо, timegeb! – LeBlanc

1

Попробуйте defaultdict - где вы можете получить время по номеру, указав как обычный словарь.

from collections import defaultdict 
d = defaultdict(int) 

alist = [1,4,1,2,1] 
blist = [6,7,8,9,5] 
for key, value in zip (alist,blist): 
    d[key]+=value 
print [i[1] for i in sorted(d.items())] 

output-

[19, 9, 7] 
+0

это не гарантирует порядок – timgeb

+0

@timgeb. Какой порядок здесь и как нарушается - пожалуйста, уточните пожалуйста. – SIslam

+0

Его нужно сортировать на основе ключа. «также он должен быть в численном порядке в соответствии с алистом». прямо из вопроса. Ваш ответ прав, но он не поддерживается. – SirParselot

2
from collections import OrderedDict 

alist = [1,4,1,2,1] 
blist = [6,7,8,9,5] 

# insert keys in sorted order 
d = OrderedDict() 
for key in sorted(set(alist)): 
    d[key] = 0 

# sum items 
for a,b in zip(alist, blist): 
    d[a] += b 

# final result 
clist = list(d.values()) # produces [19, 9, 7] 
+0

Это кажется полезным, однако есть ли способ сделать это, не импортируя ничего? – LeBlanc

+0

@LeBlanc Используйте ответ timgeb, если вы не хотите ничего импортировать – SirParselot

1

Вы можете использовать Высокий класс Счетчик!

from collections import Counter 

alist = [1,4,1,2,1] 
blist = [6,7,8,9,5] 
c = Counter() 
for a,b in zip(alist, blist): 
    c[a] += b 
clist = [v for k, v in sorted(c.items())] 
print clist 

Я думаю, что это лучшие инструмента для работы

+0

Это кажется полезным, однако есть ли способ сделать это, не импортируя ничего? – LeBlanc

+0

Нет, если вы хотите «Счетчик». Почему бы не импортировать? –

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

  • Нет связанных вопросов^_^