我试图遍历字典列表,目的是根据另一个k,v对的值生成一个k,v对的值列表。每个词典包含两个k,v对,其各自的键相同。
例如,给定以下列表:
dict_list =[{'basket': 1, 'fruit': 'apple'},
{'basket': 1, 'fruit': 'orange'},
{'basket': 1, 'fruit': 'peach'},
{'basket': 2, 'fruit': 'kiwi'},
{'basket': 2, 'fruit': 'lemon'},
{'basket': 3, 'fruit': 'grape'}]
我要生成此列表:
list_list = [['apple','orange','peach'],
['kiwi','lemon'],
['grape']]
我在遍历迭代以实现分离列表方面遇到困难。到目前为止,我只能一起获得所有水果值的列表。谢谢您的任何建议。
答案 0 :(得分:2)
您可以通过itertools使用groupby。
import itertools
list_list = [[f['fruit'] for f in v] for k, v in itertools.groupby(dict_list, key=lambda x: x['basket'])]
这假设dict_list
中的购物篮条目已排序(或相同的购物篮在列表中彼此相邻)。如果不是这种情况,请在groupby
之前排序。
答案 1 :(得分:1)
这是不使用groupby
的一种方法:
from collections import defaultdict
dict_list = [
{'basket': 1, 'fruit': 'apple'},
{'basket': 1, 'fruit': 'orange'},
{'basket': 1, 'fruit': 'peach'},
{'basket': 2, 'fruit': 'kiwi'},
{'basket': 2, 'fruit': 'lemon'},
{'basket': 3, 'fruit': 'grape'},
]
def to_list(dlist):
full_d = defaultdict(list)
for d in dlist:
basket = d['basket']
fruit = d['fruit']
full_d[basket].append(fruit)
return list(full_d.values())
print(to_list(dict_list))
输出:
[['apple', 'orange', 'peach'], ['kiwi', 'lemon'], ['grape']]
或者简化一些:
def to_list(dlist):
full_d = defaultdict(list)
for d in dlist:
full_d[d['basket']].append(d['fruit'])
return list(full_d.values())
答案 2 :(得分:1)
我知道这并不是您要问的,但也许您应该重新考虑构造事物的方式。考虑一下也许有一个可以保持篮筐状态并返回其值的类,如下所示:
class Basket:
def __init__(self):
self.basket = []
def add_item(self, item):
self.basket.append(item)
def get_basket_items(self):
return self.basket
这是将上述类实现到工作流程中的方法:
baskets = {}
baskets.update({1: Basket()})
baskets.update({2: Basket()})
baskets[1].add_item("orange")
baskets[1].add_item("apple")
baskets[2].add_item("kiwi")
all_items =[]
for basket in baskets.values():
all_items.append(basket.get_basket_items())
print(all_items)
当您要开始对数据结构中的元素进行一些时髦的操作时,类非常有用。在这方面,它们更具灵活性。 希望有帮助!