【问题标题】:List as Value of a Dictionary with Multiple Values in Each List列表作为每个列表中具有多个值的字典的值
【发布时间】:2020-10-27 12:26:32
【问题描述】:

我正在尝试使用 Python 解决以下问题:

鉴于以下学生名单:

students = ['Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha']

我需要将学生分成 3 组。每个学生的组标识由一个名为 assignment 的列表中相同索引位置的整数指定:

assignment = [2, 3, 3, 1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2]

使用理解,我需要生成字典,其中组号为键,属于该组的学生列表为值,即。预期的输出是这样的:

{'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles'],
 'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'],
 'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil']}

我的第一步是将 2 个列表压缩在一起以生成元组列表:

zip(students,assignment)

我生成了一个空字典来存储组成员:cdict = {}

我的逻辑是:检查每个元组中的整数(组号)。如果字典键中不存在该号码,请创建一个新号码并添加与该组号码对应的名称。如果存在,则将该值添加到字典的值列表中。

我想出了以下代码:

groupdict = {'Group{}'.format(group):[name] for name,group in zip(students,assignment) if group not in groupdict.keys()}

但是,它给了我以下结果:

{'Group 2': ['Astha'], 'Group 3': ['Nikhil'], 'Group 1': ['Charles']}

我试图包含 else 语句:

groupdict = {'Group{}'.format(group):[name] for name,group in zip(students,assignment) if group not in groupdict.keys() else groupdict[group].append(name)} 

但它给了我一个 SyntaxError。

我应该如何修改我的理解代码以存储值列表而不是仅存储最新值?除了使用setdefault() 函数或导入库之外,还有其他方法可以完成吗?我的代码中应该只包含forifelsezip()。 提前感谢您的帮助! :)

【问题讨论】:

    标签: python dictionary string-formatting dictionary-comprehension keyvaluepair


    【解决方案1】:

    使用dict.setdefault

    例如:

    students = ['Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha']
    assignment = [2, 3, 3, 1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2]
    result = {}
    for k,v in zip(students,assignment):
        result.setdefault(f"Group {v}", []).append(k)
    

    输出:

    {'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles'],
     'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'],
     'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil']}
    

    【讨论】:

    • 感谢 Rakesh 的及时答复!有没有办法在不使用 .setdefault() 的情况下生成相同的输出?
    • 效率不高。您将需要进行不需要的嵌套重复迭代
    【解决方案2】:

    另一种解决方案,如果您想使用 dict-comprehension(涉及使用 itertools.groupby 和排序(Rakesh 的答案在这方面更有效)):

    from itertools import groupby
    
    
    students = ['Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue', 'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha']
    assignment = [2, 3, 3, 1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2]
    
    out = {'Group {}'.format(group): [s for s, _ in g] for group, g in groupby(sorted(zip(students, assignment), key=lambda k: k[1]), lambda k: k[1])}
    print(out)
    

    打印:

    {'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles'], 
     'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'], 
     'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil']}
    

    【讨论】:

    • 感谢您的回答。我想知道是否有办法在理解中不使用 groupby() 。我不应该在我的作业中导入任何东西...:/ 可能我需要一个嵌套迭代,但我很难编写它。
    【解决方案3】:

    使用默认字典

    from collections import defaultdict
    result = defaultdict(list)
    students = [
        'Tom', 'Kitty', 'Jessie', 'Chester', 'Curie', 'Darwing', 'Nancy', 'Sue',
        'Peter', 'Andrew', 'Karren', 'Charles', 'Nikhil', 'Justin', 'Astha'
    ]
    assignment = [2, 3, 3, 1, 3, 2, 3, 1, 1, 1, 2, 1, 3, 2, 2]
    for k, v in zip(students, assignment):
        result[f"Group {v}"].append(k)
    print(result)
    

    输出

    defaultdict(<class 'list'>, {'Group 2': ['Tom', 'Darwing', 'Karren', 'Justin', 'Astha'], 'Group 3': ['Kitty', 'Jessie', 'Curie', 'Nancy', 'Nikhil'], 'Group 1': ['Chester', 'Sue', 'Peter', 'Andrew', 'Charles']})
    

    【讨论】:

      猜你喜欢
      • 2021-08-23
      • 1970-01-01
      • 2019-05-05
      • 1970-01-01
      • 2021-07-01
      • 2017-08-09
      • 1970-01-01
      • 2020-10-15
      • 2021-12-17
      相关资源
      最近更新 更多