2009-11-05 106 views
0

的名單列表:排序字典

name: john, jane 
car: db9, m5 
food: pizza, lasagne 

這些行的每一個(名字,汽車,食品)是誰擁有什麼樣的順序。因此約翰擁有汽車的DB9「和他最喜歡的食物是「比薩」。同樣與簡,她的車是「M5」和她最喜歡的食物是「意大利千層麪」。

我有有效:

>>> names['Name']="John" 
>>> namesL.append(name) 
>>> names['Name']="Jane" 
>>> namesL.append(name) 
>>> car['Car']="DB9" 
>>> cars.append(car) 
>>> car['Car']="M5" 
>>> cars.append(car) 
>>> food['Food']="Pizza" 
>>> foodL.append(food) 
>>> food['Food']="Lasagne" 
>>> foodL.append(food) 

>>>ultimateList.append(foodL) 
...  

但是我希望它使每這些事情都在自己的字典。所以像這樣:

>>>PersonalDict 
{'Name': 'John', 'Car': 'DB9', 'Food': 'Pizza'} 

我一直在盯着它一段時間,不能解決我應該如何處理這個問題。任何人都可以提供一些想法,或者我只是做一些其他的方式?

回答

3

看起來像你想要的東西,如:

import collections 

data = '''name: john, jane 
car: db9, m5 
food: pizza, lasagne 
''' 

personal_list = collections.defaultdict(dict) 

for line in data.splitlines(): 
    key, _, info = line.partition(':') 
    infos = info.split(',') 
    key = key.strip().title() 
    for i, item in enumerate(infos): 
    item = item.strip().title() 
    personal_list[i][key] = item 

for i in personal_list: 
    print personal_list[i] 

這並不做的正是你指定什麼(在DB9B的資本似乎例如完全怪異 - - 如何將代碼知道要利用特定的第二個字母,而不是任何其他第二個字母?),但它似乎相當接近。

+0

我略有困惑。你將如何在這個文件中包含閱讀內容? – Federer 2009-11-05 18:53:20

+0

要從文件中讀取,請使用'for f.readlines()'中的line。我很高興地看到,我寫的版本與Alex的幾乎相同,除了我for循環中的第一行是'(k,_,d)= map(str.title,map(str.strip,line.partition (「:」)))' – 2009-11-05 20:14:55

+0

你不需要在f.readlines()中用'for line來讀取文件;只要說'換行'就足夠了。 '.readlines()'方法將在文件的所有行中徘徊,並在內存中創建一個列表; 'open()'返回的文件對象將作爲一個迭代器,一次產生一行。 – steveha 2009-11-05 20:24:14

1

嘗試:

f = open('filename.txt') 

result = [] 
for line in f: 
    key, values = line.split(':') 
    values = values.rstrip().split(', ') 
    for i, value in enumerate(values): 
     try: 
      result[i][key] = value 
     except IndexError: 
      result.append({ key: value}) 

print result 
1

分割初始數據爲索引/鍵/值三元從那裏去。

def parse_data(lines): 
    for line in lines: 
     key, _, data = line.partition(':') 
     for i, datum in enumerate(x.strip() for x in data.split(',')): 
      yield i, key, datum 

從那裏你可以聚合數據期運用Alex的defaultdict的方法(可能是最好的)或排序和一堆額外的代碼來按需建立個人字典。

1

的敬意發電機:

#!/usr/bin/env python 
data=(zip(*([elt.strip().title() for elt in line.replace(':',',',1).split(',')] 
      for line in open('filename.txt','r')))) 
personal_list=[dict(zip(data[0],datum)) for datum in data[1:]] 
print(personal_list) 

# [{'Food': 'Pizza', 'Car': 'Db9', 'Name': 'John'}, {'Food': 'Lasagne', 'Car': 'M5', 'Name': 'Jane'}] 

要了解劇本是如何工作的,我們打破它拆開:

首先,我們加載到FILENAME.TXT行的列表:

In [41]: [line for line in open('filename.txt','r')] 
Out[41]: ['name: john, jane\n', 'car: db9, m5\n', 'food: pizza, lasagne\n'] 

接下來我們替換第一冒號(:)用逗號(,)

In [42]: [line.replace(':',',',1) for line in open('filename.txt','r')] 
Out[42]: ['name, john, jane\n', 'car, db9, m5\n', 'food, pizza, lasagne\n'] 

然後我們拆分上逗號的每一行:

In [43]: [line.replace(':',',',1).split(',') for line in open('filename.txt','r')] 
Out[43]: 
[['name', ' john', ' jane\n'], 
['car', ' db9', ' m5\n'], 
['food', ' pizza', ' lasagne\n']] 

對於每行的每個元素,我們剝離開始/結束空白和利用像標題的字符串:

In [45]: [[elt.strip().title() for elt in line.replace(':',',',1).split(',')] for line in open('filename.txt','r')] 
Out[45]: [['Name', 'John', 'Jane'], ['Car', 'Db9', 'M5'], ['Food', 'Pizza', 'Lasagne']] 

現在我們收集每個列表的第一個元素,則第二,等等:

In [47]: data=(zip(*([elt.strip().title() for elt in line.replace(':',',',1).split(',')] for line in open('filename.txt','r')))) 

In [48]: data 
Out[48]: [('Name', 'Car', 'Food'), ('John', 'Db9', 'Pizza'), ('Jane', 'M5', 'Lasagne')] 

數據[0]現在適用於一個字典的鍵。

In [49]: data[0] 
Out[49]: ('Name', 'Car', 'Food') 

data [1:]中的每個元組都是字典的值。

In [50]: data[1:] 
Out[50]: [('John', 'Db9', 'Pizza'), ('Jane', 'M5', 'Lasagne')] 

在這裏,我們拉上鍵與值:

In [52]: [ zip(data[0],datum) for datum in data[1:]] 
Out[52]: 
[[('Name', 'John'), ('Car', 'Db9'), ('Food', 'Pizza')], 
[('Name', 'Jane'), ('Car', 'M5'), ('Food', 'Lasagne')]] 

最後,我們把它變成類型的字典列表:

In [54]: [dict(zip(data[0],datum)) for datum in data[1:]] 
Out[54]: 
[{'Car': 'Db9', 'Food': 'Pizza', 'Name': 'John'}, 
{'Car': 'M5', 'Food': 'Lasagne', 'Name': 'Jane'}] 
+0

+1,但我永遠不會在生產代碼中代表這樣的東西。 – 2009-11-05 20:18:02