很抱歉,如果问题不够明确,我对python很新。如果我的代码中有任何拼写错误,我也会提前道歉。
说我有一个清单
list = [a,b,c,a,x,y,b,m,a,z]
我希望使用for循环在每个'a'之后获取元素的索引值并将其存储在dict中。 (这假定dict = {}已经存在)
for store in list:
if dict.has_key(store) == False:
if list.index(store) != len(list)-1:
dict[store] = []
dict[store].append(list[list.index(store)+1])
else:
if list.index(store) != len(list)-1:
dict[store].append(list[list.index(store)+1])
理想情况下,我希望我的词典
dict = {'a':['b','x','z'], 'b':['c','m'], 'c':['a']....etc.}
相反,我得到了
dict = {'a':['b','b','b'], 'b':['c','c'], 'c':['a']...etc.}
我意识到这是因为索引只找到第一次出现的变量存储。我如何构建我的代码,以便对于商店的每个值,我可以找到该特定值的下一个索引,而不仅仅是第一个?
另外,我想知道如何仅使用for循环执行此操作;没有递归或者等等(如果陈述很明显)。
如果我的问题不明确或者我的代码很乱,我再次道歉。
答案 0 :(得分:1)
你可以这样做:
l = ['a','b','c','a','x','y','b','m','a','z']
d={}
for i in range(len(l)-1):
if not l[i] in d:
d[l[i]] = []
d[l[i]].append(l[i+1])
然后d
是
{'a': ['b', 'x', 'z'],
'b': ['c', 'm'],
'c': ['a'],
'm': ['a'],
'x': ['y'],
'y': ['b']}
关于您的代码,您无需使用index
,因为您已经在列表中进行了枚举,因此您无需搜索当前元素的位置。此外,您可以枚举len(l)-1
,这样可以简化代码。您的代码中的问题是list.index(store)
总是在store
中找到list
的第一次出现。
答案 1 :(得分:0)
这看起来像defaultdict
的工作。此外,您应该避免使用list
和dict
作为变量,因为它们是保留字。
from collections import defaultdict
# create a dictionary that has default value of an empty list
# for any new key
d = defaultdict(list)
# create the list
my_list = 'a,b,c,a,x,y,b,m,a,z'.split(',')
# create tuples of each item with its following item
for k,v in zip(my_list, my_list[1:]):
d[k].append(v)
d
# returns:
defaultdict(list,
{'a': ['b', 'x', 'z'],
'b': ['c', 'm'],
'c': ['a'],
'm': ['a'],
'x': ['y'],
'y': ['b']})