簡體   English   中英

字典列表排序

[英]Sorting Lists of List of Dictionaries

我剛剛讀了一個類似以下的文件:

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

我一直盯着它看了一段時間,無法弄清楚該如何處理。 任何人都可以提出一些想法,還是我應該以其他方式這樣做?

看起來您想要這樣的東西:

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]

但這與您指定的功能不完全相同(例如, DB9 B的大寫字母看起來很奇怪-代碼如何知道將特定的第二個字母而不是其他任何第二個字母大寫?!),但看起來似乎很接近。

嘗試:

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

從那里將初始數據拆分為索引/鍵/值三元組。

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方法(可能是最好的)或排序以及大量額外的代碼來匯總數據,以根據需要構建單個詞典。

向發電機致敬:

#!/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')]

現在data [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'}]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM