我有一些值的清单
mylist = ['1', 'Tom', 'Jerry', '2', 'Sinchan', 'Shero']
我的预期输出
[{'id': '1', 'mod': ['Tom', 'Jerry']}, {'id': '2', 'mod': ['Sinchan', 'Shero']}]
我的试用
mylist = ['1', 'Tom', 'Jerry', '2', 'Sinchan', 'Shero']
data_list = []
mod = []
for i in mylist:
if i.isdigit() == True:
data = {}
data['id'] = i
data_list.append(data)
else:
mod.append(i)
data['mod'] = mod
print data_list
获取输出
[{'id': '1', 'mod': ['Tom', 'Jerry', 'Sinchan', 'Shero']}, {'id': '2', 'mod': ['Tom', 'Jerry', 'Sinchan', 'Shero']}]
我正在尝试根据数字获取 mod 值,依此类推,我尝试了但仍坚持逻辑,请帮助我获取解决方案。预先感谢。
答案 0 :(得分:5)
您的直接错误是不为找到的每个用户创建一个 new mod
列表。您的字典条目全部共享一个列表对象,并且在列表中附加更多值将通过共享引用显示这些额外的条目:
>>> mod = []
>>> data_list = [{'mod': mod}, {'mod': mod}] # simplified version of your result
>>> data_list
[{'mod': []}, {'mod': []}]
>>> mod.append('Tom')
>>> data_list
[{'mod': ['Tom']}, {'mod': ['Tom']}]
>>> mod.append('Jerry')
>>> data_list
[{'mod': ['Tom', 'Jerry']}, {'mod': ['Tom', 'Jerry']}]
请记住:Python names are references to values,您可以共享这些参考。
相反,在创建data
字典时,将其添加为新的空白列表:
for i in mylist:
if i.isdigit():
data = {'id': i, 'mod': []}
data_list.append(data)
else:
data['mod'].append(i)
每个data
词典都附加了一个新的空列表,您将不再看到共享数据:
>>> mylist = ['1', 'Tom', 'Jerry', '2', 'Sinchan', 'Shero']
>>> data_list = []
>>> for i in mylist:
... if i.isdigit():
... data = {'id': i, 'mod': []}
... data_list.append(data)
... else:
... data['mod'].append(i)
...
>>> data_list
[{'id': '1', 'mod': ['Tom', 'Jerry']}, {'id': '2', 'mod': ['Sinchan', 'Shero']}]
请注意,您无需使用== True
; if
语句已经测试该表达式是否产生了真值,== True
以产生True
的结果在这里是多余的。
答案 1 :(得分:1)
为每个数据创建明确的mod
变量:
if i.isdigit() == True:
data = {}
data['id'] = i
data_list.append(data)
mod = []
答案 2 :(得分:1)
In [33]: data = ['1', 'Tom', 'Jerry', '2', 'Sinchan', 'Shero']
In [39]: {k: [y[1] for y in x][1:] for k, x in itertools.groupby(zip(itertools.accumulate(map(int, map(str.isdigit, data))), data), lambda v: v[0])}
Out[39]: {1: ['Tom', 'Jerry'], 2: ['Sinchan', 'Shero']}
答案 3 :(得分:0)
代码的问题是,每次到达新的数字时,您都不会清除mod
。
这是使用itertools.groupby
的替代解决方案:
from itertools import groupby
g = [list(j) for _, j in groupby(mylist, key=str.isdigit)]
res = [{'id': num[0], 'mod': names} for num, names in zip(g[::2], g[1::2])]
结果:
[{'id': '1', 'mod': ['Tom', 'Jerry']},
{'id': '2', 'mod': ['Sinchan', 'Shero']}]