2010-08-05 42 views
5

Hoặc Cách thực hiện lệnh if trong một danh sách được sửa đổi.Máy phát điện trong câu lệnh if trong python

Tôi đã đọc StackOverflow một thời gian (nhờ tất cả mọi người). Tôi thích nó. Tôi cũng thấy rằng bạn có thể đăng câu hỏi và tự mình trả lời. Xin lỗi nếu tôi trùng lặp, nhưng tôi không tìm thấy câu trả lời cụ thể này trên StackOverflow.


  • Làm thế nào để bạn xác minh nếu một yếu tố nằm trong một danh sách nhưng sửa đổi nó trong cùng một lúc?

Vấn đề của tôi:

myList = ["Foo", "Bar"] 
if "foo" in myList: 
    print "found!" 

Như tôi không biết trường hợp của các phần tử trong danh sách tôi muốn so sánh với danh sách chữ thường. Câu trả lời rõ ràng nhưng xấu xí sẽ là:

myList = ["Foo", "Bar"] 
lowerList = [] 

for item in myList: 
    lowerList.append(item.lower()) 

if "foo" in lowerList: 
    print "found!" 

Tôi có thể làm tốt hơn không?

+4

Điểm nhỏ: trong khi bạn có thể sử dụng 'danh sách' làm tên biến, có thể bạn không nên làm như vậy có tên của kiểu dựng sẵn. –

+0

Nice bắt Peter: Tôi thực sự nghĩ rằng đó là một điểm vừa phải đến lớn. –

+0

đã thay đổi, cảm ơn! –

Trả lời

8
if any(s.lower() == "foo" for s in list): print "found" 
+2

lưu ý: bất kỳ() nào tốt hơn một chút so với việc hiểu danh sách vì nó dừng ngay khi tìm thấy mục đầu tiên. Ngoài ra nó sẽ không tạo ra một danh sách tạm thời dùng một lần. –

+0

+1 để trả lời câu hỏi như OP được hỏi, sử dụng biểu thức máy phát điện –

+0

Tôi có đúng không nếu tôi nói câu trả lời của bạn và của tôi giống nhau? –

1

Danh sách comprehensions:

mylist = ["Foo", "Bar"] 
lowerList = [item.lower() for item in mylist] 

Sau đó, bạn có thể làm điều gì đó như if "foo" in lowerlist hoặc bỏ qua các biến tạm thời hoàn toàn với if "foo" in [item.lower() for item in mylist]

0

Làm thế nào về:

theList = ["Foo", "Bar"] 
lowerCaseSet = set(x.lower for x in theList) 

if "foo" in lowerCaseSet: 
    print "found" 

BTW. bạn không nên gọi biến số list vì từ này đã được sử dụng bởi loại list.

+0

Điểm tốt cho việc đặt tên –

1

này kết hợp những ưu bộ nhớ của một biểu thức máy phát điện với mức tăng tốc từ bản sao loại bỏ:

if "foo" in (s.lower() for s in set(list)): print "found" 
+0

Tại sao bạn tạo một bộ danh sách? –

+0

Hai lý do. Bộ có thời gian tra cứu O (1) so với danh sách, có thời gian tra cứu trên O (n). Tạo một tập hợp cũng loại bỏ bất kỳ bản sao nào của dữ liệu ban đầu. –

+0

Bạn không tìm kiếm bất kỳ thứ gì trong bộ này, bạn chỉ cần lặp lại nó. –

0

Xin đừng sử dụng danh sách như tên biến, đây là phiên bản trong đó đặt máy phát điện để biến và chứng minh , thế hệ đó đã dừng lại sau khi tìm ra câu trả lời và không làm cạn kiệt máy phát điện:

list_to_search = ["Foo", "Bar"] 
lowergen = (item.lower() for item in list_to_search) 
if "foo" in lowergen: 
    print "found!" 
print next(lowergen), 'is next after it' 
Các vấn đề liên quan