如何基于具有两个键值对的词典列表中的另一个k-v对的值创建一个键值对中的值列表

时间:2019-08-15 23:18:42

标签: python

我试图遍历字典列表,目的是根据另一个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']]

我在遍历迭代以实现分离列表方面遇到困难。到目前为止,我只能一起获得所有水果值的列表。谢谢您的任何建议。

3 个答案:

答案 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)

当您要开始对数据结构中的元素进行一些时髦的操作时,类非常有用。在这方面,它们更具灵活性。 希望有帮助!