1

我正在尝试很长时间从列表中删除重复项并使用 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'}

我不介意做空。

4

3 回答 3

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'}
于 2013-06-18T15:14:12.187 回答
1

不确定您打算将与set.

您可以使用理解:

ids = {x: 0 for x in set([1,2,2,2,3,4,5,4,5,6])}
于 2013-06-18T15:12:49.773 回答
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的soultion更好。

>>> ids
['foo', 'bar', 'foobar', 'barfoo', 'foo', 'foo', 'bar']
>>> dict(enumerate(sorted(set(ids))))
{0: 'bar', 1: 'barfoo', 2: 'foo', 3: 'foobar'}
于 2013-06-18T17:21:39.027 回答