Цикл по списку в Python

177

У меня есть список с подсписками в нем. Я хочу напечатать все подсписки с длиной, равной 3.

Я делаю следующее в Python:

for x in values[:]:
    if len(x) == 3:
        print(x)

valuesэто оригинальный список. Печатает ли приведенный выше код каждый подсписок длиной 3 для каждого значения x? Я хочу отображать списки, где length == 3только один раз.

Проблема решена. Проблема в редакторе Eclipse. Я не понимаю причину, но при запуске цикла отображается только половина моего списка.

Есть ли какие-либо настройки, которые я должен изменить в Eclipse?

user1188821
источник
1
Не могли бы вы сделать print valuesи показать результат здесь? редактировать: или просто проверить, что это не пусто.
Разбойник
1
Лучший ответ: stackoverflow.com/a/28072982/4561887
Габриэль Стейплз

Ответы:

196

Попробуй это,

x in mylistлучше и читабельнее, чем x in mylist[:]и ваш len(x)должен быть равен 3.

>>> mylist = [[1,2,3],[4,5,6,7],[8,9,10]]
>>> for x in mylist:
...      if len(x)==3:
...        print x
...
[1, 2, 3]
[8, 9, 10]

или если вам нужно больше питонического использования списочных пониманий

>>> [x for x in mylist if len(x)==3]
[[1, 2, 3], [8, 9, 10]]
>>>
RanRag
источник
15

Вы можете также использовать for x in valuesвместо for x in values[:]; последний делает ненужную копию. Кроме того, конечно, этот код проверяет длину 2, а не 3 ...

Код печатает только один элемент на значение x- и xвыполняет итерацию по элементам values, которые являются подсписками. Таким образом, он будет печатать каждый список только один раз.

нафтогаз
источник
4
values ​​[:] вырезает все элементы значений, верно? Я предполагаю, что вы имели в виду временный список, созданный нарезкой. Просто хочу убедиться.
батбрат
1
Спасибо за упоминание нежелательной копии. @batbrat это не вырезает, это вырезает, я имею в виду, что значения дублируются, и все еще в values.
AsTeR
Спасибо за разъяснение.
batbrat
14

Вот решение, которое я искал. Если вы хотите создать List2, который содержит разницу числовых элементов в List1.

list1 = [12, 15, 22, 54, 21, 68, 9, 73, 81, 34, 45]
list2 = []
for i in range(1, len(list1)):
  change = list1[i] - list1[i-1]
  list2.append(change)

Обратите внимание, что while len(list1)равно 11 (elements), len(list2)будет только 10 элементов, потому что мы начинаем цикл for с элемента с индексом 1 в list1, а не с элемента с индексом 0 в list1

Кин Амарал
источник
Это было именно то, что мне было нужно, так как мне нужно было начинать с индекса 1, а не с 0. +1
timv
1

Сделайте это вместо этого:

values = [[1,2,3],[4,5]]
for x in values:
    if len(x) == 3:
       print(x)
Адитья Шах
источник