2014-12-04 96 views
5

我有以下列表:如何在循環內的字典中的鍵中添加值?

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

我怎樣才能讓下面的詞典:

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

我試過如下:

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

創建的密鑰,但之後我有插入值的問題(is_number是一個函數,用於檢查列表的值是數字還是字符串)。第一天離開MATLAB.First第一天Python的..

回答

4

這裏,實際上使用該defaultdict提供了對正常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 

另外:你應該爲類實例使用小寫名稱。大寫名字通常保留給類。閱讀pep8獲取樣式指南。

1

假設你有你的列表(x)的第一位置的鍵和一個字母后,會出現一個數字:

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

如果你initializ每個字典值都帶有一個空列表,不需要使用'defaultdict'。 – PeterE 2014-12-04 21:21:45

+0

@彼得,好點。 – syntagma 2014-12-04 21:26:03

2

您可以使用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

我不認爲OP希望1或3是關鍵。 – Kevin 2014-12-04 21:07:54

+0

@Kevin是的,我想念somthing我會更新,感謝提醒 – Kasramvd 2014-12-04 21:08:24

4

如果列表x中的鍵/值條目均勻分佈,則可以使用以下方法構建字典。它使用內置的特性和功能,Python的幾個:

>>> 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]} 

要解釋什麼正在這裏使用:

  • 列表分片從x建立新的清單:x[start:stop:step]
  • 這裏zip需要兩個列表並且列出包含每個列表的第n個元素的元組
  • map(int, pair)將數字串的元組變成整數列表
  • values構造有列表解析 - 的map函數施加到每對
  • dict變成對的列表到字典的鍵/值
+0

哇哇,如果價值是動態???,像'a',1,2,'b',4,5,6 ??? – Hackaholic 2014-12-04 21:16:52

+1

這隻能解決OP在相關條目均勻分佈的情況。我會在答案中說清楚。 – 2014-12-04 21:20:12

1

使用itertools.groupby和一些迭代東西:

>>> 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]} 

這裏第一個迭代器會產生類似於:

>>> [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]] 

現在,由於此迭代器將交替產生鍵值,因此我們可以遍歷此迭代器並從中獲取下一項(即,e。使用的值)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] 

還有另一種方式來消費這個迭代器正在使用zip,但它是一個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

只使用dictlist簡單的解決方案:

>>> 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']}