基于条件的Python进程列表

时间:2018-09-05 11:18:25

标签: python list split

我有一些值的清单

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 值,依此类推,我尝试了但仍坚持逻辑,请帮助我获取解决方案。预先感谢。

4 个答案:

答案 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']}]

请注意,您无需使用== Trueif语句已经测试该表达式是否产生了真值,== 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']}]