【问题标题】:Merging two lists into dictionary while keeping duplicate data in python将两个列表合并到字典中,同时在 python 中保留重复数据
【发布时间】:2018-05-25 16:49:18
【问题描述】:

嗨,我想将两个列表合并到一个字典中。假设我有两个列表,如下所示

list_one = ['a', 'a', 'c', 'd']

list_two = [1,2,3,4]

我希望我的字典是这样的

{'a': 1, 'a': 2, 'c': 3, 'd': 4}

截至目前,我有以下代码

print dict(zip(['a', 'a', 'c', 'd'], [1,2,3,4]))

但是上面代码的输出是这样的

{'a': 2, 'c': 3, 'd': 4}

我怎样才能达到这个输出?

{'a': 1, 'a': 2, 'c': 3, 'd': 4}

谢谢

【问题讨论】:

  • 这根本不可能。
  • @Julien 也许不是在 Python 中使用它的字典,但是对于相同键具有重复条目的字典是可能的。 Red-Black 等平衡树可以处理它并提供范围查询,例如查找最低或最高重复键等。
  • @Kaz,也许但这里 OP 正在谈论 python dict...
  • @Julien 我明白了,那么在 python 中有什么方法可以让我做一个映射函数来获得我想要的输出吗?
  • 这根本不可能,因为您的问题毫无意义:正如@Sebastian 所说,'a' 的映射是什么? 1 还是 2?还是应该是[1,2]?你需要澄清......

标签: python python-2.7 list dictionary


【解决方案1】:

dicts 的一个定义特征是每个键都是唯一的。因此,您不能有两个 'a' 键。否则,my_dict['a'] 会返回什么?

【讨论】:

  • my_dict['a'] 会返回什么”这个问题其实有一些合理的答案。对于旨在支持多个条目的字典,可以在此区域中给出要求。 C++ 有一个std::multiset 字典类型,它支持find 函数和[] 索引。基本上这些返回重复键之一;没有具体说明哪个。有一种可靠的方法可以遍历整个重复键范围。 IE。暗示要求不合理的反问并不是真正的答案;这不是 dict 在 Python 中的方式,仅此而已。
  • 啊,我明白了,那这样就不可能了吧?
  • @IqbalPratama 不可能直接。但是,Python dict 当然可以用于编写将多个值与同一个键相关联的代码。只需将键与值列表而不是值相关联。具体来说,{'a': [1, 2], 'c': [3], 'd': [4]}.
  • @IqbalPratama 取决于您希望my_dict['a'] 返回的内容。
【解决方案2】:

字典必须具有唯一键,因此您必须更改您的要求。将元组列表作为解决方法怎么样?

l = list(zip(['a', 'a', 'c', 'd'],[1,2,3,4]))
print(l)

结果是:

[('a', 1), ('a', 2), ('c', 3), ('d', 4)]

您可以像这样轻松地迭代和解包:

for k, v in l:
    print("%s: %s" % (k, v))

产生:

a: 1
a: 2
c: 3
d: 4

如果你希望它是可散列的,你可以像这样创建一个元组:

l = tuple(zip(['a', 'a', 'c', 'd'],[1,2,3,4]))

【讨论】:

  • 出现错误 -> TypeError: unhashable type: 'list'
  • 我更新了我的答案以展示如何创建一个元组的元组。
【解决方案3】:

由于字典中的键是唯一的,因此对于常规的 Python 字典,在这里获取 {'a': 1, 'a': 2, 'c': 3, 'd': 4} 是不可能的,因为键 'a' 只能出现一次。但是,您可以将键映射到存储在列表中的多个值,例如{'a': [1, 2], 'c': [3], 'd': [4]}

一种选择是创建一个defaultdict 以便为您轻松完成此操作:

from collections import defaultdict

list_one = ['a', 'a', 'c', 'd']

list_two = [1, 2, 3, 4]

d = defaultdict(list)
for key, value in zip(list_one, list_two):
    d[key].append(value)

print(dict(d))

哪些输出:

{'a': [1, 2], 'c': [3], 'd': [4]}

【讨论】:

    【解决方案4】:

    来自documentation for dictionaries

    最好将字典视为一组无序的键:值对,要求键是唯一的(在一个字典中)。一对大括号创建一个空字典:{}。在大括号内放置一个逗号分隔的键:值对列表,将初始键:值对添加到字典中;这也是在输出中写入字典的方式。

    【讨论】:

      【解决方案5】:

      字典有唯一的键。如果您需要“a”的值单独将压缩数据存储在列表中,或者您可以在字典的值部分中使用列表并将值存储为: {'a': [1,2],'c': [3], 'd': [4]}

      【讨论】:

        【解决方案6】:

        正如其他答案所指出的,字典具有唯一的键,但是,可以创建一个结构来模仿您正在寻找的行为:

        class NewDict:
           def __init__(self, *values):
               self.values = list(zip(*values))
           def __getitem__(self, key):
                return [b for a, b in sorted(self.values, key=lambda x:x[0]) if a == key]
           def __repr__(self):
               return "{}({})".format(self.__class__.__name__, "{"+', '.join("{}:{}".format(*i) for i in sorted(self.values, key=lambda x:x[0]))+"}")
        
        list_one = ['a', 'a', 'c', 'd']
        list_two = [1,2,3,4]
        d = NewDict(list_one, list_two)
        print(d['a'])
        print(d)
        

        输出:

        [1, 2]
        NewDict({a:1, a:2, c:3, d:4})
        

        【讨论】:

        • 哇。为这个令人敬畏的创造力 +1。
        【解决方案7】:

        你有两个选择:

        要么你使用元组:

        list_one = ['a', 'a', 'c', 'd']
        
        list_two = [1,2,3,4]
        
        
        
        print(list(map(lambda x,y:(x,y),list_one,list_two)))
        

        输出:

        [('a', 1), ('a', 2), ('c', 3), ('d', 4)]
        

        第二个选项是使用这种模式:

        dict_1={}
        
        for key,value in zip(list_one,list_two):
            if key not in dict_1:
                dict_1[key]=[value]
            else:
                dict_1[key].append(value)
        
        print(dict_1)
        

        输出:

        {'a': [1, 2], 'd': [4], 'c': [3]}
        

        【讨论】:

          【解决方案8】:

          字典中的键应该是唯一的。

          根据python文档:

          最好将字典视为一组无序的键:值对,并要求键是唯一的(在一个字典中)。

          link 到文档

          【讨论】:

            猜你喜欢
            • 2013-02-28
            • 2023-03-28
            • 2019-01-05
            • 1970-01-01
            • 2023-02-06
            • 1970-01-01
            • 2021-04-10
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多