7

Tôi đang làm việc với từ điển cho một chương trình đảo chữ cái trong Python. Các khóa là các bộ chữ được sắp xếp và các giá trị là các mảng của các từ có thể có với các chữ cái đó:Gọt xuống từ điển các danh sách bằng Python

wordlist = { 
    ('d', 'g', 'o'): ['dog', 'god'], 
    ('a', 'c', 't'): ['act', 'cat'], 
    ('a', 's', 't'): ['sat', 'tas'], 
} 

Tôi đang sử dụng regex để lọc danh sách. Vì vậy, cho r't$' như một bộ lọc kết quả cuối cùng nên là:

filtered_list = { 
    ('a', 'c', 't'): ['act', 'cat'], 
    ('a', 's', 't'): ['sat'], 
} 

Cho đến nay tôi đã nhận được nó xuống để hai bước. Thứ nhất, giữ cho tất cả các từ phù hợp với các biểu hiện:

tmp = {k: [w for w in v if re.search(r't$', w)] for k, v in wordlist.items()} 

này khiến tôi với danh sách rỗng:

{ 
    ('d', 'g', 'o'): [], 
    ('a', 'c', 't'): ['act', 'cat'], 
    ('a', 's', 't'): ['sat'], 
} 

Sau đó, tôi cần một đường chuyền thứ hai để thoát khỏi danh sách rỗng:

filtered_list = {k: v for k, v in tmp.items() if v} 

Tôi chắc chắn có một cách để thực hiện các bước này, nhưng tôi vẫn chưa tìm ra. Có cách nào để kết hợp chúng không? Hoặc một cách tốt hơn để làm điều này nói chung?

+2

Chào mừng bạn đến với SO. Đây là một câu hỏi tuyệt vời đầu tiên. – shx2

+0

Cảm ơn! Tôi đã cố gắng để đảm bảo rằng tôi đã làm tất cả các nghiên cứu của tôi trước khi bàn tay. Tôi là một anh chàng Perl hai mươi tuổi, và có một số thành ngữ Python kỳ lạ mà tôi vẫn đang cố gắng quấn quanh đầu mình. – phraktyl

Trả lời

4

Thực hiện việc này theo hai bước là tốt và có thể dễ đọc.

Nhưng để trả lời câu hỏi của bạn, đây là một lớp lót (được chia thành nhiều dòng, để dễ đọc). Nó sử dụng một biểu thức máy phát để tạo các cặp từ bước đầu tiên.

{ 
    k:v for k, v in 
    (
    (kk, [w for w in vv if re.search(r't$', w)]) 
    for kk, vv in wordlist.items() 
) 
    if v 
} 
=> {('a', 'c', 't'): ['act', 'cat'], ('a', 's', 't'): ['sat']} 
+1

Đây là những gì tôi đang tìm kiếm. Xuất sắc! Cảm ơn bạn! Nó cũng giúp tôi hiểu thêm về sự hiểu biết về danh sách và các máy phát điện, vốn rất không quen thuộc vào thời điểm này. – phraktyl

+0

Giả sử từ điển này là lớn, trên python2 nó sẽ hữu ích để sử dụng 'iteritems' thay vì' mục'? – SethMMorton

+0

@SethMMorton, tuyệt đối. Điều đó gần như luôn luôn đúng trong python2. Tôi sử dụng 'mục' bởi vì đó là những gì OP được sử dụng và bởi vì điểm cụ thể đó không liên quan đến câu hỏi được hỏi. – shx2

4

Đối với một lót, một cái gì đó như thế này?

A = {k:[w for w in v if re.search(r't$', w)] for k,v in wordlist.items() if any(re.search(r't$', w) for w in v)} 
+0

Tôi đã đề nghị ban đầu tách thành> 1 dòng nhưng điều này thực sự rất dễ đọc, đẹp. – joc

+0

Điều này có vẻ tốt đẹp, nhưng có vẻ như nó bao gồm tất cả các từ trong danh sách nếu có bất kỳ từ nào khớp với nhau, trái với chỉ các từ phù hợp. Nó bao gồm 'sat' và 'tas', chỉ có 'sat' phù hợp với biểu thức. – phraktyl

+0

vì vậy bạn muốn cái cuối cùng trong khóa của bạn là 't'? – ysakamoto

Các vấn đề liên quan