Liệt kê khả năng hiểu với câu lệnh if


106

Tôi muốn so sánh 2 mục lặp và in các mục xuất hiện trong cả hai mục.

>>> a = ('q', 'r')
>>> b = ('q')


# Iterate over a. If y not in b, print y.
# I want to see ['r'] printed.
>>> print([ y if y not in b for y in a])
                              ^

Nhưng nó mang lại cho tôi một lỗi cú pháp không hợp lệ nơi ^đã được đặt. Có gì sai về chức năng lamba này?


5
tất cả các câu trả lời dưới đây đều đúng, nhưng cũng b = ('q')không tạo ra một bộ giá trị. Bộ dữ liệu với một nhu yếu tố một rõ ràng ,, đó làb = ('q',)
dmg

Tôi đã thay đổi tuplesthành iterables.
OrangeTux

Câu trả lời:


187

Bạn đã đặt sai thứ tự. Các ifnên sau for(trừ khi nó đang ở trong một if-elsenhà điều hành ternary)

[y for y in a if y not in b]

Tuy nhiên, điều này sẽ hoạt động:

[y if y not in b else other_value for y in a]

Cảm ơn. Tôi đã thấy bài đăng này stackoverflow.com/questions/4406389/… về câu lệnh if else trong hàm lambda. Và tôi nghĩ rằng chỉ sử dụng câu lệnh if (không có lệnh khác) sẽ hoạt động theo thứ tự tương tự.
OrangeTux

39

Bạn đặt ifở cuối:

[y for y in a if y not in b]

Các phần hiểu danh sách được viết theo thứ tự giống như các bản sao được chỉ định đầy đủ lồng nhau của chúng, về cơ bản câu lệnh trên được dịch thành:

outputlist = []
for y in a:
    if y not in b:
        outputlist.append(y)

Phiên bản của bạn đã cố gắng thực hiện việc này thay thế:

outputlist = []
if y not in b:
    for y in a:
        outputlist.append(y)

nhưng việc hiểu danh sách phải bắt đầu với ít nhất một vòng lặp bên ngoài.


Bạn rất hữu ích. Cảm ơn bạn.
Tolgahan ÜZÜN

7

công thức hiểu danh sách:

[<value_when_condition_true> if <condition> else <value_when_condition_false> for value in list_name]

do đó bạn có thể làm như thế này:

[y for y in a if y not in b]

Chỉ dành cho mục đích trình diễn: [y nếu y không ở b khác Sai đối với y trong a]


2
Bạn không thể đặt elsemột danh sách dễ hiểu, không phải nơi bạn đặt ít nhất một danh sách. Đừng nhầm lẫn giữa khả năng hiểu danh sách (lọc) với một biểu thức điều kiện (phải có một giá trị, làm cho biểu thức else bắt buộc).
Martijn Pieters

Đồng ý. elseđược sử dụng trong việc hiểu danh sách mặc dù như được hiển thị trong mã.
Vishvajit Pathak

2
Đó là một biểu thức điều kiện . Nó có thể được sử dụng ở bất cứ đâu có thể áp dụng một biểu thức hợp lệ. Nó không cụ thể để liệt kê các hiểu biết.
Martijn Pieters

5

Đây không phải là một hàm lambda. Đó là một danh sách dễ hiểu.

Chỉ cần thay đổi thứ tự:

[ y for y in a if y not in b]

-2

Tôi đã nghiên cứu và thử các đề xuất ở trên về khả năng hiểu danh sách cho trường hợp của tôi như được mô tả bên dưới nhưng nó không hoạt động. Tôi làm gì sai ở đây?

sent_splt=[['good', 'case,', 'excellent', 'value.'], ['great', 'for', 'the', 'jawbone.'],['tied', 'to', 'charger', 'for', 'conversations', 'lasting', 'more', 'than', '45', 'minutes.major', 'problems!!']]

stop_set = ['the', 'a', 'an', 'i', 'he', 'she', 'they', 'to', 'of', 'it', 'from']

x=[a for a in sent_splt if a not in stop_set]
print(x)

Nó không phải là lọc các từ.


1
Điều bạn cần làm là đặt một câu hỏi. Không đăng một câu trả lời.
Whirl Mind

Trên thực tế, nó đang nói để đăng câu hỏi sau 1 ngày nghỉ từ 2 ngày trước đối với tôi. Về cơ bản, tôi không được phép đăng câu hỏi vì câu hỏi trước đây của tôi không theo tiêu chuẩn stackoverflow. Xin lỗi vì sự bất tiện.
Deepak Dhiman
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.