Список процессов Python, основанный на условии - PullRequest
0 голосов
/ 05 сентября 2018

У меня есть список с некоторыми значениями

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 голосов
/ 05 сентября 2018

Проблема с вашим кодом заключается в том, что вы не очищаете 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']}]
0 голосов
/ 05 сентября 2018

Создать переменную очистки mod для каждых данных:

  if i.isdigit() == True:
        data = {}
        data['id'] = i
        data_list.append(data)
        mod = []
0 голосов
/ 05 сентября 2018
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']}
0 голосов
/ 05 сентября 2018

Ваша немедленная ошибка - не создавать новый 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 здесь избыточно.

...