2016-09-23 5 views
-1

Я пытаюсь придумать опрятный способ сделать это в python.Создайте список из существующего списка пар значений ключа в python

У меня есть список пар букв и цифр, которые выглядят следующим образом:

[(a,1),(a,2),(a,3),(b,10),(b,100),(c,99),(d,-1),(d,-2)] 

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

Таким образом, вывод должен выглядеть следующим образом:

alist = [1,2,3] 
blist = [10,100] 
clist = [99] 
dlist = [-1,-2] 

Есть отличный способ сделать это в Python?

+2

Вы слышите о defaultdict? –

+0

@ AvinashRaj: Я этого не делал. Спасибо – Piyush

ответ

2
from collections import defaultdict 

data = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 

if __name__ == '__main__': 
    result = defaultdict(list) 

    for alphabet, number in data: 
     result[alphabet].append(number) 

или без модуля коллекции:

if __name__ == '__main__': 
    result = {} 
    for alphabet, number in data: 
     if alphabet not in result: 
      result[alphabet] = [number, ] 
      continue 
     result[alphabet].append(number) 

Но я думаю, что первое решение более эффективно и ясно.

+0

Есть ли способ сделать это без defaultdict тоже в случае, если я не хочу использовать библиотеку коллекций? – Piyush

+0

да, конечно, вы можете сделать это без defaultdict, см. Отредактированный ответ – ShabashP

-1

Вы можете использовать defaultdict из collections модуля для этого:

from collections import defaultdict 

l = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 
d = defaultdict(list) 

for k,v in l: 
    d[k].append(v) 

for k,v in d.items(): 
    exec(k + "list=" + str(v)) 
1

Если вы хотите, чтобы избежать использования defaultdict, но удобно использовать itertools, вы можете сделать это с однострочника

from itertools import groupby 

data = [('a',1),('a',2),('a',3),('b',10),('b',100),('c',99),('d',-1),('d',-2)] 
grouped = dict((key, list(pair[1] for pair in values)) for (key, values) in groupby(data, lambda pair: pair[0])) 
# gives {'b': [10, 100], 'a': [1, 2, 3], 'c': [99], 'd': [-1, -2]} 
+0

Я действительно реализовал свой собственный словарь. Но спасибо в любом случае – Piyush

0

После просмотра ответов в потоке и чтения реализации defaultdict я реализовал свою собственную версию, так как не хотел использовать библиотеку коллекций.

mydict = {} 
    for alphabet, value in data: 
     try: 
      mydict[alphabet].append(value) 
     except KeyError: 
      mydict[alphabet] = [] 
      mydict[alphabet].append(value) 
Смежные вопросы