我试图从字符串列表生成字典,以便:
例如,
x = ['one', 'two', 'one', 'three', 'two']
结果:
{
'one' : ['two', 'three']
'two' : ['one']
'three' : ['two']
}
现在我使用它的for循环给了我这个:
{
'one' : ['two']
'two' : ['one']
'one' : ['three']
'three' : ['two']
}
答案 0 :(得分:1)
当然,有许多方法可以解决这个问题,但是给出了:
mylist = ['one', 'two', 'one', 'three', 'two']
一种可能的解决方案:(我想到的第一个)
mydict = {}
for counter, val in enumerate(mylist[0:-1]):
mydict.setdefault(val, []).append(mylist[counter + 1])
我使用mylist[0:-1]
,因此我们只迭代到第二个最后一个元素
类似的解决方案是跟踪父母:
mydict = {}
parent = mylist[0]
for val in mylist[1:]:
mydict.setdefault(parent, []).append(val)
parent = val
[编辑:] 我从@ phihag的回答中了解了setdefault,并更新了我自己的。从本质上讲,它缩写为(所以我将其纳入上面的答案中):
if val not in mydict:
mydict[val] = []
答案 1 :(得分:1)
使用zip
和dict.setdefault
功能:
x = ['one', 'two', 'one', 'three', 'two']
d = {}
for el, follow in zip(x, x[1:]):
d.setdefault(el, []).append(follow)
print(d)
答案 2 :(得分:1)
strcpy
非常适合构造具有相同值类型的字典。在您的情况下,值类型是list:
defaultdict
答案 3 :(得分:0)
#is this what you want?
x = ['one', 'two', 'one', 'three', 'two']
result = {}
for i in range(len(x)-1):
result.update({x[i] : [x[j] for j in range(i+1,len(x))]})
#update the last entry
result.update({x[len(x)-1] : [x[0]]})
result
{'one':['three','two'],'three':['two'],'two':['one']}
答案 4 :(得分:0)
不确定您的代码是什么样的,但您希望如何执行此操作:
您要使用集合的原因是为了删除可能遇到的任何可能的重复项。您希望将其转换为列表,因为您的值是列表格式。
x = ['one', 'two', 'one', 'three', 'two']
my_dict = {}
for i in range(len(x) - 1):
if x[i] is not in my_dict.keys():
my_dict[x[i]] = [x[i + 1]]
else:
my_dict[x[i]].append(x[i + 1])
最后,my_dict
就是你想要的。