基于条件的 Python 进程列表



我有一些值的列表

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值,我尝试过但坚持逻辑,请帮助我获得解决方案。提前谢谢。

你的直接错误是没有为你找到的每个用户创建一个新的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 名称是对值的引用,您可以共享这些引用。

相反,请在创建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生成True结果在这里是多余的。

为每个数据创建清晰的mod变量:

if i.isdigit() == True:
data = {}
data['id'] = i
data_list.append(data)
mod = []
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']}

代码的问题在于每次到达新数字时都不会清除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']}]

最新更新