假设我有一个字符串列表:
["dog", "cat" ,"boy", "cat", "car", "bus",....]
我想把它转换成这样的字典:
{"dog": ["cat"], "cat":["boy","car"], "boy": ["cat"], "car":["bus"]....}
将列表中的每个字符串转换为键并将以下字符串作为列表转换为值的最佳方法是什么? 有时候我用相同的键得到的值很少,所以我想将它们组合在一起(就像上面词典的第二个索引一样)。
答案 0 :(得分:7)
lst = ["dog", "cat" ,"boy", "cat", "car", "bus"]
pairs = zip(lst, lst[1:]) # [("dog", "cat"), ("cat", "boy"), ...]
d = {}
for k,v in pairs:
d.setdefault(k, []) # Set e.g. d["dog"] to [] if there is no d["dog"] yet
d[k].append(v)
答案 1 :(得分:4)
以下是defaultdict
和dict.setdefault
答案的强制性if key in dict
答案。
from collections import defaultdict
lst = ["dog", "cat" ,"boy", "cat", "car", "bus"]
d = defaultdict(list)
for a, b in zip(lst, lst[1:]):
d[a].append(b)
如果这是一个非常大的列表并且内存效率问题,您可能需要使用itertools
中的izip
和islice
。
答案 2 :(得分:0)
如果您添加错误检查而不尝试添加索引为len(mylist)
的元素,则此类内容应该有效:
d = {}
for i,s in enumerate(mylist):
if s in d:
d[s].append(mylist[i+1])
else:
d[s] = [mylist[i+1]]
编辑:需要使用s
作为密钥。
答案 3 :(得分:0)
你可能需要这样的东西:
res = {}
for i in range(len(l) - 1):
try:
res[l[i]].append(l[i+1])
except KeyError:
res[l[i]] = [l[i+1]]
答案 4 :(得分:0)
很难为你的问题提供一个绝对的,可靠的解决方案,因为你说“有时我用相同的密钥得到的价值很少”。我们如何知道哪些值与哪个键放在一起?
这是一个简单的算法,可以将列表的每个元素作为键,并使用以下元素作为值:
my_list = sometimes I get few values with the same key
my_dict = dict([])
last = ''
init = 0
for a in my_list:
if init == 0:
init = 1
last = a
pass
my_dict[last] = a
last = a
现在你的my_dict将包含列表中的所有元素作为键,并使用以下元素作为值。
希望这有帮助。