Условно присоединиться к предыдущей записи списка, используя понимание - PullRequest
0 голосов
/ 14 февраля 2019

Я пытаюсь исправить некоторые неработающие пути linux в списке, с которым я работаю.

Список:

mylist = ['/root/path/path', '/cat', '/dog', '/root/path/path', '/blue', '/red']

Требования:

Если элемент не начинаетсяс помощью '/root', присоединитесь к элементу слева от него.

Код на данный момент:

mylist2 = [''.join(x) for x in mylist]

print(mylist2)

Ожидаемый результат:

['/root/path/path/cat/dog', '/root/path/path/blue/red']

Фактический результат:

['/root/path/path', '/cat', '/dog', '/root/path/path', '/blue', '/red']

Я также пытался:

mylist2 = [''.join(x) if myroot not x for mylist]

..., что приводит к синтаксической ошибке ...

Есть идеи о том, что я делаю неправильно?

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Это один метод, использующий понимание списка:

mylist2 = ['/root' + x for x in ''.join(mylist).split('/root') if x]  # if x eliminates the empty split elements

# ['/root/path/path/cat/dog', '/root/path/path/blue/red']

Поскольку ваша цель состоит в том, чтобы объединить все, а затем разделить их на /root, эта строка понимания списка делает именно это и добавляет /rootвернуться к каждому элементу.

Но, как вы можете видеть, учитывая только код, ответ @ chepner гораздо понятнее и понятнее.Тот факт, что понимание списков существует, не означает, что он должен быть вашим.

Кроме того, я должен отметить, что если в любом из ваших элементов есть /root (необязательно в начале), этот код такжеотделите его из-за разделения, поэтому оно не так точно, как явное прохождение цикла.Если вы захотите разобраться с этим сценарием, он станет очень уродливым ...:

['/root' + y for y in ''.join("_" + x if x.startswith("/root") else x for x in lst).split("_/root") if y]

# eww
0 голосов
/ 14 февраля 2019

Это проще, если вы просто используете обычный цикл.Проблема с пониманием списка состоит в том, что у вас нет единообразной операции над каждым элементом первого списка, который создает элемент для нового списка.(Представьте, что составление списка представляет собой комбинацию map и filter. Вы можете сопоставить одно старое значение одному новому значению или удалить старое значение, но вы не можете объединить несколько старых значений в одно новое значение.)

mylist2 = []
for path in mylist:
    if path.startswith('/root'):
        mylist2.append(path)
    else:
        mylist2[-1] += path

(Это только частично правильно; предполагается, что первый элемент mylist будет фактически начинаться с /root, так что mylist2[-1] никогда не будет использоваться, если mylist2 пусто.) * +1010 *

...