2014-12-04 14 views
5

Mam następującą listę:Jak dodać wartości w kluczach w słowniku wewnątrz pętli?

x=['a','3','4','b','1','2','c','4','5'] 

Jak mogę złożyć następujące słownika:

b = {'a':[3,4],'b':[1,2],'c':[4,5]} 

Próbowałem następujące:

Category = defaultdict(int) 
for i in a: 
    if Varius.is_number(i)==False: 
     Category[i]=[] 
     keys.append(i) 
    else: 
     Category[keys(i)] = i 

Klucze są tworzone, ale po mam problem z wstawieniem wartości. (is_number to funkcja, która sprawdza, czy wartość listy jest liczbą lub łańcuchem). Pierwszego dnia poza MATLAB. Pierwszy dzień w Python ..

Odpowiedz

4

Oto przykład, który faktycznie korzysta z funkcji, które defaultdict zapewnia ponad normalny dict:

from collections import defaultdict 

x=['a','3','4','b','1','2','c','4','5'] 

key='<unknown>' # needed if the first value of x is a number 
category = defaultdict(list) # defaultdict with list 
for i in x: 
    if i.isalpha(): 
     key = i; 
    else: 
     category[key].append(i) # no need to initialize with an empty list 

print category 

Ponadto: w przypadku wystąpień klas należy używać małych liter. Nazwy wielkich liter są zwykle zarezerwowane dla klas. Przeczytaj pep8, aby uzyskać poradnik stylu.

1

Zakładając, że masz klucz na pierwszych pozycjach listy (x) i że po liście, nie będzie wiele:

from collections import defaultdict 

x=['a','3','4','b','1','2','c','4','5'] 

key = x[0] 
Category = defaultdict(int) 
for i in x: 
    if i.isalpha(): 
     key = i; 
    else: 
     Category[key].append(i) 

print Category 
+0

Jeśli zainicjowałeś e każdej wartości słownika z pustą listą, nie ma potrzeby używania 'defaultdict'. – PeterE

+0

@Peter, dobry punkt. – syntagma

2

Można użyć itertools.groupby:

>>> from itertools import groupby 
>>> l=[list(g) for k,g in groupby(x,lambda x : x.isalpha())] 
>>> p=[l[i:i+2] for i in range(0,len(l),2)] 
>>> {i[0]:map(int,j) for i,j in p} 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 
+0

Nie sądzę, że OP chciał 1 lub 3 być kluczami. – Kevin

+0

@Kevin tak, tęsknię za czymś będę aktualizować, dziękuję za przypomnienie – Kasramvd

4

Jeśli pozycje klucza/wartości na liście x są równomiernie rozmieszczone, oto alternatywny sposób na zbudowanie słownika. Wykorzystuje kilka Pythona wbudowane funkcje i funkcje:

>>> keys = x[::3] 
>>> values = [map(int, pair) for pair in zip(x[1::3], x[2::3])] 
>>> dict(zip(keys, values)) 
{'a': [3, 4], 'b': [1, 2], 'c': [4, 5]} 

Aby wyjaśnić, co wykorzystywane jest tutaj:

  • lista krojenie do tworzenia nowych list od x: x[start:stop:step]
  • tutaj zip trwa dwie listy i tworzy listę krotek zawierających n-te elementy z każdej listy
  • map(int, pair) zamienia krotkę cyfr na listę liczb całkowitych
  • values jest wykonana z listowego - funkcja map stosuje się do każdej pary
  • dict okazuje listę par do kluczy słownikowych/wartości
+0

wahat o tym, czy wartości są dynamiczne ???, takich jak "a", 1,2, "b", 4,5,6 ??? – Hackaholic

+1

Dotyczy to tylko przypadku OP, w którym odpowiednie wpisy są równomiernie rozmieszczone. Powiem to jasno w odpowiedzi. –

1

Korzystanie itertools.groupby i trochę iterator rzeczy:

>>> from itertools import groupby 
>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> {k: next(it) for k in it} 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 

Tutaj pierwszy iterator da coś w rodzaju:

>>> [next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)] 
['a', [3, 4], 'b', [1, 2], 'c', [4, 5]] 

Teraz, gdy ten iterator będzie generował na przemian wartość klucz-wartość, możemy zawrócić ten iterator i pobrać z niego następny element (tj.e wartość) przy użyciu next()

>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> for k in it:                
    print k,'-->' ,next(it) 
...  
a --> [3, 4] 
b --> [1, 2] 
c --> [4, 5] 

Jest inny sposób spożywać ten iterator, który używa zip, ale to little hard to understand IMO:

>>> it = (next(g) if k else map(int, g) for k, g in groupby(x, str.isalpha)) 
>>> dict(zip(*[it]*2)) 
{'a': [3, 4], 'c': [4, 5], 'b': [1, 2]} 
0

Proste rozwiązanie używając tylko dict i list:

>>> category = {} 
>>> for i in x: 
...  if i.isalpha(): 
...   items = category[i] = [] 
...  elif category: 
...   items.append(i) 
... 
>>> print(category) 
{'c': ['4', '5'], 'a': ['3', '4'], 'b': ['1', '2']} 
Powiązane problemy