Vòng qua một danh sách trong Python


177

Tôi có một danh sách với danh sách phụ trong đó. Tôi muốn in tất cả các danh sách con có độ dài bằng 3.

Tôi đang làm như sau trong python:

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

valueslà danh sách ban đầu. Mã ở trên có in mọi danh sách con có độ dài bằng 3 cho mỗi giá trị xkhông? Tôi muốn hiển thị danh sách con length == 3chỉ một lần.

Vấn đề đã được giải quyết. Vấn đề là với trình soạn thảo Eclipse. Tôi không hiểu lý do, nhưng nó chỉ hiển thị một nửa danh sách của tôi khi tôi chạy vòng lặp của mình.

Có bất kỳ cài đặt nào tôi phải thay đổi trong Eclipse không?


1
Bạn có thể làm print valuesvà hiển thị đầu ra ở đây? chỉnh sửa: hoặc chỉ kiểm tra xem nó không trống.
Brigand

1
Câu trả lời hay nhất: stackoverflow.com/a/28072982/4561887
Gabriel Staples

Câu trả lời:


196

Thử cái này,

x in mylistlà tốt hơn và dễ đọc hơn x in mylist[:]và bạn len(x)nên bằng 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]

hoặc nếu bạn cần thêm danh sách sử dụng pythonic

>>> [x for x in mylist if len(x)==3]
[[1, 2, 3], [8, 9, 10]]
>>>

15

Bạn cũng có thể sử dụng for x in valueschứ không phải for x in values[:]; cái sau tạo ra một bản sao không cần thiết. Ngoài ra, tất nhiên mã đó kiểm tra độ dài 2 thay vì 3 ...

Mã chỉ in một mục trên mỗi giá trị của x- và xđang lặp lại trên các thành phần của values, đó là danh sách phụ. Vì vậy, nó sẽ chỉ in mỗi danh sách con một lần.


4
giá trị [:] cắt ra tất cả các yếu tố của giá trị, phải không? Tôi giả sử rằng bạn có nghĩa là danh sách tạm thời được tạo ra từ lát cắt. Chỉ muốn chắc chắn.
batbrat

1
Cảm ơn đã đề cập đến các bản sao không mong muốn. @batbrat nó không cắt ra, nó cắt ra, ý tôi là các giá trị được nhân đôi và vẫn còn values.
AsTeR

Cảm ơn đã làm rõ.
batbrat

14

Đây là giải pháp tôi đang tìm kiếm. Nếu bạn muốn tạo List2 có chứa sự khác biệt của các phần tử số trong 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)

Lưu ý rằng trong khi len(list1)là 11 (phần tử), len(list2)sẽ chỉ có 10 phần tử vì chúng tôi đang bắt đầu vòng lặp for của chúng tôi từ phần tử với chỉ số 1 trong list1 chứ không phải từ phần tử có chỉ số 0 trong list1


Đây chỉ là những gì tôi cần vì tôi cần bắt đầu từ chỉ số 1 chứ không phải 0. +1
timv 20/03/19

1

Thay vào đó, hãy làm điều này:

values = [[1,2,3],[4,5]]
for x in values:
    if len(x) == 3:
       print(x)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.