【问题标题】:How to create dictionary from two lists without losing duplicate values?如何从两个列表创建字典而不丢失重复值?
【发布时间】:2012-12-28 22:22:48
【问题描述】:

我有两个列表:

pin_list = ['in0', 'in1', 'in2', 'y']
delvt_list = ['0.399', '0.1995', '0.1995', '0.399']

我使用以下代码: temp = dict(zip(delvt_list,pin_list)) 但我得到以下信息:

temp = {'0.1995': 'in2', '0.399': 'y'}

我需要编写哪些 Python 代码才能获得:

temp =  {'0.1995': {'in2', 'in1'}, '0.399': {'y', 'in0'}}

temp =  {'0.1995': ['in2', 'in1'], '0.399': ['y', 'in0']}

另外一个问题是,如果我想使用 temp 中的值来搜索我正在阅读的行,使用集合或列表会更容易吗?

【问题讨论】:

    标签: python list dictionary set


    【解决方案1】:

    使用collections.defaultdict:

    temp = defaultdict(set)
    
    for delvt, pin in zip(delvt_list, pin_list):
        temp[delvt].add(pin)
    

    这会创建一个defaultdict,其中默认值为一个集合,然后循环并添加每个键的值。

    如果您想要一个列表,只需更改默认类型以及添加值的方式以匹配list 接口:

    temp = defaultdict(list)
    
    for delvt, pin in zip(delvt_list, pin_list):
        temp[delvt].append(pin)
    

    当您想测试成员资格时,集合是一个更好的主意 (something in aset);这样的测试需要恒定的时间,而不是列表的线性时间(因此集合成员资格测试需要固定的时间量,与集合的大小无关,而对于列表,它需要更多的时间,与列表中的元素数量成正比) .

    【讨论】:

      【解决方案2】:

      你可以使用dict.setdefault():

      In [20]: pin_list = ['in0', 'in1', 'in2', 'y']
      
      In [21]: delvt_list = ['0.399', '0.1995', '0.1995', '0.399']
      
      In [22]: dic={}
      
      In [23]: for x,y in zip(pin_list,delvt_list):
          dic.setdefault(y,[]).append(x)
         ....:     
      
      In [24]: dic
      Out[24]: {'0.1995': ['in1', 'in2'], '0.399': ['in0', 'y']}
      

      或者如果你想要基于set 的输出:

      In [29]: dic={}
      
      In [30]: for x,y in zip(pin_list,delvt_list):
          dic.setdefault(y,set()).add(x)
         ....:     
      
      In [31]: dic
      Out[31]: {'0.1995': set(['in1', 'in2']), '0.399': set(['y', 'in0'])}
      

      help()dict.setdefault:

      D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多