【问题标题】:Unique list (set) to dictionary唯一列表(集)到字典
【发布时间】:2013-06-14 21:12:01
【问题描述】:

我尝试了很长时间从列表中删除重复项并使用 php (0,1,2....) 之类的键创建字典。

我试过了:

ids = dict(set([1,2,2,2,3,4,5,4,5,6]))
print ids

那我想

for key, value in ids.iteritems():
     #stuff

我当然会收到以下错误,因为 ids 不是字典:

TypeError: cannot convert dictionary update sequence element #0 to a sequence

谢谢!

编辑:

我认为我的数据有点误导:

我有一个清单:[foo, bar, foobar, barfoo, foo, foo, bar]

我想将其转换为:{ 1: 'foo', 2 : 'bar', 3 : 'foobar', 4: 'barfoo'}

我不介意做空。

【问题讨论】:

  • 您希望 是什么?
  • @MartijnPieters 这些是值。我必须创建密钥。检查我的更新以获得澄清
  • 集合没有顺序;如何挑选钥匙?
  • dict(enumerate(['foo', 'bar', 'baz'])) -> {0: 'foo', 1: 'bar', 2: 'baz'} 但我不明白这一点。您究竟想在这里实现什么目标?
  • 为什么要它成为字典?列表已经可以按位置索引

标签: python list dictionary set unique


【解决方案1】:

您可以为此使用 zip。

示例代码

>>> ids
['foo', 'bar', 'foobar', 'barfoo', 'foo', 'foo', 'bar']
>>> dict(zip(range(1,len(ids)+1), sorted(set(ids))))
{1: 'bar', 2: 'barfoo', 3: 'foo', 4: 'foobar'}
>>>

如果要以0开头,那么Aya的灵魂更好。

>>> ids
['foo', 'bar', 'foobar', 'barfoo', 'foo', 'foo', 'bar']
>>> dict(enumerate(sorted(set(ids))))
{0: 'bar', 1: 'barfoo', 2: 'foo', 3: 'foobar'}

【讨论】:

    【解决方案2】:

    要将您的一组值转换为具有从序列中挑选的有序“键”的字典,请使用带有计数器的 defaultdict 来分配键:

    from collections import defaultdict
    from itertools import count
    from functools import partial
    
    keymapping = defaultdict(partial(next, count(1)))
    outputdict = {keymapping[v]: v for v in inputlist}
    

    这会将数字(从 1 开始)分配为输入列表中值的键,以先到先得的方式进行。

    演示:

    >>> from collections import defaultdict
    >>> from itertools import count
    >>> from functools import partial
    >>> inputlist = ['foo', 'bar', 'foobar', 'barfoo', 'foo', 'foo', 'bar']
    >>> keymapping = defaultdict(partial(next, count(1)))
    >>> {keymapping[v]: v for v in inputlist}
    {1: 'foo', 2: 'bar', 3: 'foobar', 4: 'barfoo'}
    

    【讨论】:

      【解决方案3】:

      不确定您打算将与 set 中的每个键关联的值设为什么。

      你可以使用理解:

      ids = {x: 0 for x in set([1,2,2,2,3,4,5,4,5,6])}
      

      【讨论】:

        猜你喜欢
        • 2012-06-20
        • 1970-01-01
        • 2017-11-02
        • 1970-01-01
        • 1970-01-01
        • 2016-03-10
        • 1970-01-01
        • 2019-01-14
        • 2015-12-28
        相关资源
        最近更新 更多