【问题标题】:How to convert a list of lists to a dictionary with redundant keys?如何将列表列表转换为具有冗余键的字典?
【发布时间】:2020-01-17 19:53:14
【问题描述】:

我有一个列表列表,名为my_list

['sit', (1, 1)]
['laboris', (2, 1)]
['nisi', (2, 1)]
['est', (4, 1)]
['qui', (4, 1)]
['cillum', (3, 1)]
['voluptate', (3, 1)]
['eu', (3, 1)]
['irure', (3, 1)]
['sunt', (4, 1)]
['reprehenderit', (3, 1)]
['nulla', (3, 1)]
['sint', (4, 1)]
['fugiat', (3, 1)]
['dolore', (2, 1)]
['dolore', (3, 1)]
['enim', (2, 1)]
['occaecat', (4, 1)]
['tempor', (2, 1)]
['commodo', (2, 1)]
['non', (4, 1)]
['minim', (2, 1)]
['aute', (3, 1)]
['ut', (2, 2)]
['ex', (2, 1)]
['deserunt', (4, 1)]
['ea', (2, 1)]
['eiusmod', (2, 1)]
['culpa', (4, 1)]
['labore', (2, 1)]
['mollit', (4, 1)]
['officia', (4, 1)]
['cupidatat', (4, 1)]
['adipiscing', (2, 1)]
['amet', (1, 1)]
['et', (2, 1)]
['ad', (2, 1)]
['consectetur', (2, 1)]
['anim', (4, 1)]
['magna', (2, 1)]
['quis', (2, 1)]
['ullamco', (2, 1)]
['dolor', (1, 1)]
['dolor', (3, 1)]
['aliquip', (2, 1)]
['velit', (3, 1)]
['ipsum', (1, 1)]
['incididunt', (2, 1)]
['sed', (2, 1)]
['id', (4, 1)]
['esse', (3, 1)]
['exercitation', (2, 1)]
['nostrud', (2, 1)]

我试过了:

d = {}

for item in all_lists:
    d[item[0]] = item[1:]

print (d)

但这会覆盖一个键,而不是更新那个值。例如,dolor 变为:{'dolor': [(3,1)],而不是期望的目标:{'dolor': (3,1), (1,1), etc...}

理想情况下,字典形状不会包含元组列表作为值,但如果需要的话。

如何将该列表列表转换为我想要的格式的字典?

我观察到了Python: List of lists to dictionary,但这让我发现了我现在的错误。

【问题讨论】:

标签: python list dictionary


【解决方案1】:

使用默认字典功能:

https://docs.python.org/2/library/collections.html#collections.defaultdict

未经测试的代码!

d = defaultdict(list)

for item in all_lists:
    d[item[0]].append(item[1:])

print (d)

【讨论】:

  • 它将每个元组包装到额外的列表中。例如{'sit': [[(1, 1)], [(2, 2)]], 'laboris': [[(2, 1)]]}
  • 如何解决? @ovgolovin
  • @JerryM。 append(item[1]) 而不是 append(item[1:])
【解决方案2】:

您可以使用itertools.groupby,以防键已经排序(看起来是这样):

import itertools as it
result = {k: [x[1] for x in v] for k, v in it.groupby(test, key=lambda x: x[0])}

【讨论】:

  • 如果一直没有排序怎么办? (在这种情况下是的,但我认为我们很幸运)
  • @JerryM。您始终可以事先使用sorted,但对于具有许多不同键的大型列表,这可能会影响性能,最好使用defaultdict
【解决方案3】:

如果d 缺少此键且值为空列表[],则其中一种方法是添加新的键值对。然后将新值附加到该列表。

Python 有 setdefault 来做到这一点。

all_lists = [
    ['sit', (1, 1)],
    ['sit', (2, 2)],
    ['laboris', (2, 1)]
]

d = {}
for key, new_value in all_lists:
    values = d.setdefault(key, [])
    values.append(new_value)

print(d)


{
 'sit': [(1, 1), (2, 2)], 
 'laboris': [(2, 1)]
}

【讨论】:

    【解决方案4】:

    这很烦人,但您可以通过快速调用构造函数将list 更改为tuple

    a = [
        ['sit', (1, 1)],
        ['laboris', (2, 1)],
        ['nisi', (2, 1)],
        ['est', (4, 1)],
        ['qui', (4, 1)],
        ['cillum', (3, 1)],
        ['voluptate', (3, 1)],
        ['eu', (3, 1)],
        ['irure', (3, 1)],
        ['sunt', (4, 1)],
        ['reprehenderit', (3, 1)],
        ['nulla', (3, 1)],
        ['sint', (4, 1)],
        ['fugiat', (3, 1)],
        ['dolore', (2, 1)],
        ['dolore', (3, 1)],
        ['enim', (2, 1)],
        ['occaecat', (4, 1)],
        ['tempor', (2, 1)],
        ['commodo', (2, 1)],
        ['non', (4, 1)],
        ['minim', (2, 1)],
        ['aute', (3, 1)],
        ['ut', (2, 2)],
        ['ex', (2, 1)],
        ['deserunt', (4, 1)],
        ['ea', (2, 1)],
        ['eiusmod', (2, 1)],
        ['culpa', (4, 1)],
        ['labore', (2, 1)],
        ['mollit', (4, 1)],
        ['officia', (4, 1)],
        ['cupidatat', (4, 1)],
        ['adipiscing', (2, 1)],
        ['amet', (1, 1)],
        ['et', (2, 1)],
        ['ad', (2, 1)],
        ['consectetur', (2, 1)],
        ['anim', (4, 1)],
        ['magna', (2, 1)],
        ['quis', (2, 1)],
        ['ullamco', (2, 1)],
        ['dolor', (1, 1)],
        ['dolor', (3, 1)],
        ['aliquip', (2, 1)],
        ['velit', (3, 1)],
        ['ipsum', (1, 1)],
        ['incididunt', (2, 1)],
        ['sed', (2, 1)],
        ['id', (4, 1)],
        ['esse', (3, 1)],
        ['exercitation', (2, 1)],
        ['nostrud', (2, 1)]
    ]
    
    final = {}
    for l in a:
        final[l[0]]=tuple(l[1:])[0]
    
    print(final)
    

    打印

    {'sit': (1, 1), 'laboris': (2, 1), 'nisi': (2, 1), 'est': (4, 1), 'qui': (4, 1), 'cillum': (3, 1), 'voluptate': (3, 1), 'eu': (3, 1), 'irure': (3, 1), 'sunt': (4, 1), 'reprehenderit': (3, 1), 'nulla': (3, 1), 'sint': (4, 1), 'fugiat': (3, 1), 'dolore': (3, 1), 'enim': (2, 1), 'occaecat': (4, 1), 'tempor': (2, 1), 'commodo': (2, 1), 'non': (4, 1), 'minim': (2, 1), 'aute': (3, 1), 'ut': (2, 2), 'ex': (2, 1), 'deserunt': (4, 1), 'ea': (2, 1), 'eiusmod': (2, 1), 'culpa': (4, 1), 'labore': (2, 1), 'mollit': (4, 1), 'officia': (4, 1), 'cupidatat': (4, 1), 'adipiscing': (2, 1), 'amet': (1, 1), 'et': (2, 1), 'ad': (2, 1), 'consectetur': (2, 1), 'anim': (4, 1), 'magna': (2, 1), 'quis': (2, 1), 'ullamco': (2, 1), 'dolor': (3, 1), 'aliquip': (2, 1), 'velit': (3, 1), 'ipsum': (1, 1), 'incididunt': (2, 1), 'sed': (2, 1), 'id': (4, 1), 'esse': (3, 1), 'exercitation': (2, 1), 'nostrud': (2, 1)}
    

    【讨论】:

    • 我发布的示例 (dolor) 失败了。
    • dict 不能包含重复的键,因为字符串将具有相同的哈希值。如果您想通过其他方式键入dict,则可以,但尝试使用相同的键写入第二个值总是会失败。
    • 除非它被包含为元组的元组或元组的列表,正如其他人发布的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-04-03
    • 2021-12-09
    • 2012-04-08
    相关资源
    最近更新 更多