【问题标题】:Set value as key and a list of values as value in Python在 Python 中将值设置为键并将值列表设置为值
【发布时间】:2022-12-01 03:36:38
【问题描述】:

我有一个大的像这样的字典(250k+ 键):

dict = {
        0: [apple, green],
        1: [banana, yellow],
        2: [apple, red],
        3: [apple, brown],
        4: [kiwi, green],
        5: [kiwi, brown],             
        ...
}

目标实现:

1. 我想要一个以列表的第一个值作为键的新字典,以及同一个键的值列表。是这样的:

new_dict = {
               apple: [green, red, brown]
               banana: [yellow]
               kiwi: [green, brown],
               ... 
    }

2. 之后我想计算每个键的值的数量(例如{apple:3, banana:1, kiwi,2}),这可以用Counter轻松实现,所以这应该不是问题。 然后,我只想选择具有一定数量值的键(例如,如果我只想保留与 2 个或更多值关联的键,final_dict 将是这样的:

final_dict = {
              apple:3,
              kiwi:2,
              ....
}

3.然后我想从至少有2个值的元素的dict返回原始键,所以最后我将有:

original_keys_with_at_least_2_values = [0, 2, 3, 4, 5]

我的代码

# Create new_dict like: new_dict = {apple:None, banana:None, kiwi:None,..}  

new_dict = {k: None for k in dict.values()[0]}  
for k in new_dict.keys():
    for i in dict.values()[0]:
        if i == k:
        new_dict[k] = dict[i][1]

我一直在使用嵌套的for cicles,即使我知道 Python 理解速度更快,但我真的不知道如何解决它。任何解决方案或想法将不胜感激。

【问题讨论】:

  • 请显示您到目前为止编写的代码。速度不应该成为清晰度的目标
  • 另外,如果键是序列号,你为什么最初使用字典?只需使用列表列表
  • @OneCricketeer 这只是一个让我的问题更容易理解的例子,在我原来的字典中,键不是连续的。用我的代码编辑我的问题

标签: python dictionary dictionary-comprehension


【解决方案1】:

您可以使用 defaultdict 按第一个条目对项目进行分组

from collections import defaultdict

fruits = defaultdict(list)

data = {
  0: ['apple', 'green'],
  1: ['banana', 'yellow'],
  2: ['apple', 'red'],
  3: ['apple', 'brown'],
  4: ['kiwi', 'green'],
  5: ['kiwi', 'brown']
}

for _, v in data.items():
  fruits[v[0]].extend(v[1:])

print(dict(fruits))
# {'apple': ['green', 'red', 'brown'], 'banana': ['yellow'], 'kiwi': ['green', 'brown']}

然后,使用理解来获得计数

fruits_count = {k: len(v) for k, v in fruits.items()}

然后需要一个嵌套循环来收集原始密钥

original_keys_with_2_count = []
for fruit, count in fruits_count.items():

  for k, values in data.items():
    if fruit == values[0] and count >= 2:
      original_keys_with_2_count.append(k)

print(original_keys_with_2_count)
# [0, 2, 3, 4, 5]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    • 2012-07-08
    • 1970-01-01
    • 2017-12-02
    • 2017-07-28
    相关资源
    最近更新 更多