Зацикливание разделения на списки - PullRequest
1 голос
/ 17 июня 2019

Я новичок в Python и не могу исправить свою ошибку с любым количеством Google.Я хочу разделить список с помощью цикла, но не могу получить правильный синтаксис.

alist = ["aa-aa-aa-aa|bb|cc","bb-bb-bb|abc|ab","cc-cccc-cc|abc|a"]
alist[0] = alist[0].split("|")
alist[0][0] = alist[0][0].split("-")
print(alist)

Вышеприведенное работает для случая разбиения первой записи первой записи, но я бы хотел разделить первую запись каждого элемента в списке.

Заданный вывод:

[[['aa', 'aa', 'aa', 'aa'], 'bb', 'cc'], 'bb-bb-bb|abc|ab', 'cc-cccc-cc|abc|a']

Желаемый вывод:

[[['aa', 'aa', 'aa', 'aa'], 'bb', 'cc'], [['bb','bb','bb'],'abc','ab'], [['cc','cccc','cc'],'abc','a']

Однако, когда я пытаюсь зациклить, как для файла, я получаю ошибку.

alist = ["aa-aa-aa-aa|bb|cc","bb-bb-bb|abc|ab","cc-cccc-cc|abc|a"]
n = 0
for n in alist:
    alist[n] = alist[n].split("|")
    alist[n][0] = alist[n][0].split("-")
print(alist)

Сообщение об ошибке:

Traceback (most recent call last):
  File "C:\Users\EALDEN3\Documents\Python Code\Scratch.py", line 5, in <module>
    alist[n] = alist[n].split("|")
TypeError: list indices must be integers or slices, not str

Любая помощь будет принята с благодарностью.

Ответы [ 4 ]

2 голосов
/ 17 июня 2019

В вашем for цикле n это элемент, а не индекс, вам нужно сделать цикл по-другому, если вы хотите работать с индексами:

alist = ["aa-aa-aa-aa|bb|cc","bb-bb-bb|abc|ab","cc-cccc-cc|abc|a"]
for index in range(len(alist)):
    alist[index] = alist[index].split("|")
    alist[index][0] = alist[index][0].split("-")
print(alist)

Выход:

[[['aa', 'aa', 'aa', 'aa'], 'bb', 'cc'], [['bb', 'bb', 'bb'], 'abc', 'ab'], [['cc', 'cccc','cc'], 'abc', 'a']]

Обратите внимание, что ваше решение выполняет операцию на месте (возможно, это не то, что вам нужно).

Если вам нужна однострочная строка, она также эффективно выдает тот же результат:

result = [[val.split('-') if index == 0 else val for index, val in enumerate(substr.split('|'))] for substr in alist]
1 голос
/ 17 июня 2019

[Исправлено] Мне нравятся списки, и я думаю, что это сработает:

alist = ["aa-aa-aa-aa|bb|cc","bb-bb-bb|abc|ab","cc-cccc-cc|abc|a"]

output = [[y.split('-') if '-' in y else y for y in x.split('|')] for x in alist]
print(output)

Это просто цикл над каждым элементом в исходном списке, затем разделенный на '|'и затем разделяется на '-', если '-' находится в подстроке.

Вывод:

[[['aa', 'aa', 'aa', 'aa'], 'bb', 'cc'], [['bb', 'bb', 'bb'], 'abc', 'ab'], [['cc', 'cccc', 'cc'], 'abc', 'a']]
1 голос
/ 17 июня 2019

Вы можете попробовать понимание вложенного списка для этого:

alist = ["aa-aa-aa-aa|bb|cc","bb-bb-bb|abc|ab","cc-cccc-cc|abc|a"]
alist = [[j.split('-')  if j.count('-')>0 else j for j in i.split('|')] for i in alist]

Вывод :

[[['aa', 'aa', 'aa', 'aa'], 'bb', 'cc'], [['bb', 'bb', 'bb'], 'abc', 'ab'], [['cc', 'cccc', 'cc'], 'abc', 'a']]
0 голосов
/ 17 июня 2019
[ [x.split('|')[0].split('-')]+ x.split('|')[1:] for x in alist]

вышеупомянутые работы, однако split ('|') будет вызываться дважды для каждого элемента в alist

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...