2014-11-04 74 views
2

對不起,如果這聽起來像一個愚蠢的問題,但這個問題讓我感到困惑。我對python相當陌生,所以也許我錯過了一些東西。我做了一些研究,但沒有太多。這裏是:比較嵌套列表和編輯

我打算使用一個簡單的例子,使問題更清晰,我的數據是不同的,但格式和要求的行動是相同的。我們有一個人的數據庫和他們吃的披薩(以及其他一些數據)。然而,我們的數據庫有不同比薩餅的同一個人的多個條目(因爲我們結合了不同比薩店的數據)。

例如數據集:我們注意到

allData = [['joe','32', 'pepperoni,cheese'],['marc','24','cheese'],['jill','27','veggie supreme, cheese'],['joe','32','pepperoni,veggie supreme']['marc','25','cheese,chicken supreme']]

一些東西,規則我要遵循:雖然

  • 名字可以出現多次在我們知道這種特殊情況下任何具有相同名稱的條目都是同一個人。

  • 對於同一個人在不同的條目中,年齡可能不同,所以我們選擇我們遇到的第一個年齡段並使用它。例如marc的年齡是24,我們將從第二個條目忽略25

我想編輯的數據,使一個人的名字只出現一次,他吃的比薩餅是所有條目一套獨特同名。如前所述,年齡只是第一次遇到。因此,我會想在最終的數據是這樣的:

fixedData = [['joe','32','pepperoni,cheese,veggie supreme'],['marc','24','cheese,chicken supreme'],['jill','27','veggie supreme, cheese']]

我就行思考的東西:

fixedData = [] 
for i in allData: 
    if i[0] not in fixedData[0]:  
     fixedData.append[i] 
    else: 
     fixedData[i[-1]]=set(fixedData[i[-1]],i[-1]) 

我知道我在做幾個錯誤。請你請指出我朝着正確的方向?

感謝堆。

回答

1

由於名稱是唯一的,因此將它們用作字典中的鍵是有意義的,其中名稱是鍵。這將在你的情況下更合適:

>>> d = {} 
>>> for i in allData: 
    if i[0] in d: 
     d[i[0]][-1] = list(set(d[i[0]][-1] + (i[-1].split(',')))) 
    else: 
     d[i[0]] = [i[1],i[2].split(',')] 


>>> d 
    {'jill': ['27', ['veggie supreme', ' cheese']], 'joe': ['32', ['pepperoni', 'cheese', 'pepperoni', 'veggie supreme']], 'marc': ['24', ['cheese', 'cheese', 'chicken supreme']]} 
+0

這正是我所需要的。謝謝。 – 2014-11-04 10:31:11

+0

歡迎光臨。唉,我已經打了3333個重點......誰現在就高舉我的意見,摧毀這個獨一無二的號碼.. – WeaselFox 2014-11-04 10:32:51

0

在像你這樣的情況下,我喜歡使用defaultdict。我真的很討厭列表索引帶來的猜測。

from collections import defaultdict 

allData = [['joe', '32', 'pepperoni,cheese'], 
      ['marc', '24', 'cheese'], 
      ['jill', '27', 'veggie supreme, cheese'], 
      ['joe', '32', 'pepperoni,veggie supreme'], 
      ['marc', '25', 'cheese,chicken supreme']] 

d = defaultdict(dict) 
for name, age, pizzas in allData: 
    d[name].setdefault('age', age) 
    d[name].setdefault('pizzas', set()) 
    d[name]['pizzas'] |= set(pizzas.split(',')) 

請注意使用setdefault來設置我們遇到的第一個年齡值。它還可以使用set union來獲得獨特的比薩餅。