python 3.6 ошибка или я чокнутый - PullRequest
0 голосов
/ 29 мая 2020

проверяет, являются ли элементы в списке последовательными.

[True for x in lst[:-1] for y in lst[1:] if x + 1 == y]

поэтому list [1, 2, 3, 4, 5] возвращает [True, True, True, True], что означает, что список является последовательным.

list [1,2,3,4,4] возвращает [True, True, True, True] это означает, что список является последовательным, но это не так.

выполнение для каждого оператора доказывает, что

lst = [1,2,3,4,4]


def consecutive(lst):    
    lst.sort()
    return [True for x in lst[:-1] for y in lst[1:] if x + 1 == y]


print(consecutive(lst))

some_list = []
for i,j in zip(lst[:-1], lst[1:]):
    if i+1 == j:
        some_list.append(True)
    else:
        some_list.append(False)

print(some_list)

Что мне здесь не хватает?

Ответы [ 5 ]

7 голосов
/ 29 мая 2020

Ваше понимание списка выполняет вложенные циклы, а не параллельные циклы. Он проходит через перекрестное произведение двух ломтиков. Вы можете увидеть это, если удалите if и вернете сами значения x и y.

>>> [(x, y) for x in lst[:-1] for y in lst[1:]]
[(1, 2), (1, 3), (1, 4), (1, 4), (2, 2), (2, 3), (2, 4), (2, 4), (3, 2), (3, 3), (3, 4), (3, 4), (4, 2), (4, 3), (4, 4), (4, 4)]

Результат будет содержать True, если парные элементы являются последовательными; когда они не идут подряд, это ничего не добавляет к результату. Есть 4 пары, которые идут подряд, так что вы получите результат.

Если вы хотите проверить только соседние элементы, используйте zip() в понимании:

>>> [True for x, y in zip(lst[:-1], lst[1:]) if x + 1 == y]
[True, True, True]

Если вы хотите вернуть в списке и True, и False, вы не должны использовать if, вы должны вернуть результат теста:

>>> [(x + 1 == y) for x, y in zip(lst[:-1], lst[1:])]
[True, True, True, False]
1 голос
/ 29 мая 2020

Я не думаю, что ваш код делает то, что вы думаете.

Я немного изменил его, и вот что произошло:

>>> [[x, y] for x in lst[:-1] for y in lst[1:]]
[[1, 2], [1, 3], [1, 4], [1, 4], [2, 2], [2, 3], [2, 4], [2, 4], [3, 2], [3, 3], [3, 4], [3, 4], [4, 2], [4, 3], [4, 4], [4, 4]]

Ваше понимание списка на самом деле является 2D l oop, и вы просто фильтруете все комбинации для полуслучайного числа из True.

В вашем случае [1, 2], [2, 3], [3, 4] и [3, 4] удовлетворяют условию x + 1 == y.

Рассмотрите возможность перезаписи consecutive, вот краткая идея, например:

def consecutive(lst):
    return [lst[i] + 1 == lst[i + 1] for i in range(len(lst) - 1)]
    # implicitly does the same thing as return [True if lst[i] + 1 == lst[i + 1] else False for i in range(len(lst) - 1)]
0 голосов
/ 29 мая 2020

Попробуйте следующее:

[True  if(lst[x]+1 == lst[x+1])  else False for x in range(len(lst)-1)]
0 голосов
/ 29 мая 2020

Вам действительно нужна только ОДНА итерация для выполнения sh this

См. Код ниже:

def consecutive(list_):
    n = len(list_)
    list_.sort()
    ans = [True if list_[i-1]+1 == list_[i] else False for i in range(1,n)]
    return ans
list_ = [2,5,1,2,6,3,7,7]
print(consecutive(list_))
[True, False, True, False, True, True, False]
0 голосов
/ 29 мая 2020

Я бы переписал первую функцию следующим образом:

lst = [1,2,3,4,4]


def consecutive(lst):    
    lst.sort()
    return [True if lst[:-1][i] +1 ==lst[1:][i] else False  for i,x in enumerate(lst[:-1])  ]  

print(consecutive(lst))
[True, True, True, False]

Это показывает, что первые три элемента являются последовательными.
Если вы просто хотите, чтобы последовательные пары были установлены на True, используйте следующий код:

lst = [1,2,3,4,4]


def consecutive(lst):    
    lst.sort()
    return [True for i,x in enumerate(lst[:-1]) if lst[:-1][i] +1 ==lst[1:][i]   ]


print(consecutive(lst))
[True, True, True]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...