проверить следующий элемент в понимании списка - PullRequest
0 голосов
/ 28 ноября 2018

Вы можете оставить элемент один в понимании списка в соответствии с таким условием:

>>> mylist = [6,7,3,9,2,7,4]
>>> [x-1 if x!=7 else x for x in mylist]
[5, 7, 2, 8, 1, 7, 3]

Однако мне нужно, чтобы элемент оставался один, если элемент после него равен 7.

[x-1 if next_element!=7 else x for x in mylist]

Требуемый вывод:

[6,6,2,8,2,6,3]

Я думал, что это могло бы быть возможно с enumerate и индексом, но не могу решить это.Есть идеи?

Ответы [ 4 ]

0 голосов
/ 28 ноября 2018

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

Я считаю, что следующее гораздо более читабельно.

mylist = [6,7,3,9,2,7,4]
newlist = []
length = len(mylist)
for index, item in enumerate(mylist):
  if index + 1 < length and mylist[index + 1] == 7:
    newlist.append(item)
  else:
    newlist.append(item - 1)
0 голосов
/ 28 ноября 2018

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

mylist = [6,7,3,9,2,7,4]
L = len(mylist)
a = [x-1 if (i+1<N and mylist[i+1]!=7 or i==N-1) else x for i, x in enumerate(mylist)]

Если вы работаете с большими списками и хотите улучшитьпроизводительность, вы можете сделать L = len(mylist) вне понимания списка и заменить его в условии.

0 голосов
/ 28 ноября 2018

enumerate и index - это один из способов, но вы можете сделать это с помощью zip:

mylist = [6,7,3,9,2,7,4]
[x[0]-(x[1]!=7) for x in zip(mylist, mylist[1:] + [0])]

# [6, 6, 2, 8, 2, 6, 3]
0 голосов
/ 28 ноября 2018

Вы можете сделать:

mylist = [6, 7, 3, 9, 2, 7, 4]

result = [current - 1 if ne != 7 else current for current, ne in zip(mylist, mylist[1:])] + [mylist[-1] - 1]
print(result)

Вывод

[6, 6, 2, 8, 2, 6, 3]
...