Tôi đang cố gắng viết một câu lệnh Hiểu danh sách sẽ chỉ thêm một mục nếu nó hiện không có trong danh sách. Có cách nào để kiểm tra các mục hiện tại trong danh sách hiện đang được xây dựng không? Đây là một ví dụ ngắn gọn:
Đầu vào
{ "Stefan" : ["running", "engineering", "dancing"], "Bob" : ["dancing", "art", "theatre"], "Julia" : ["running", "music", "art"] }Đầu ra
["running", "engineering", "dancing", "art", "theatre", "music"]Mã mà không sử dụng danh sách hiểu biết
output = [] for name, hobbies in input.items(): for hobby in hobbies: if hobby not in output: output.append(hobby)Nỗ lực của tôi
[hobby for name, hobbies in input.items() for hobby in hobbies if hobby not in ???]
Bhargav Rao
47.4K27 Huy hiệu vàng122 Huy hiệu bạc137 Huy hiệu đồng27 gold badges122 silver badges137 bronze badges
Khi được hỏi ngày 19 tháng 5 năm 2015 lúc 17:07May 19, 2015 at 17:07
Bossbalystefan BossbalystefanStefan Bossbaly
6.5329 Huy hiệu vàng51 Huy hiệu bạc81 Huy hiệu đồng9 gold badges51 silver badges81 bronze badges
3
Bạn có thể sử dụng ["running", "engineering", "dancing", "art", "theatre", "music"] 9 và đặt hiểu:
{hobby for name, hobbies in input.items() for hobby in hobbies}Như M.Wasowski đã đề cập, chúng tôi không sử dụng output = [] for name, hobbies in input.items(): for hobby in hobbies: if hobby not in output: output.append(hobby) 0 ở đây, vì vậy chúng tôi có thể sử dụng output = [] for name, hobbies in input.items(): for hobby in hobbies: if hobby not in output: output.append(hobby) 1 thay vào đó: thay vào đó:
{hobby for hobbies in input.values() for hobby in hobbies}Nếu bạn thực sự cần một danh sách làm kết quả, bạn có thể làm điều này (nhưng lưu ý rằng thông thường bạn có thể làm việc với các bộ mà không có bất kỳ vấn đề nào):
list({hobby for hobbies in input.values() for hobby in hobbies})
Đã trả lời ngày 19 tháng 5 năm 2015 lúc 17:12May 19, 2015 at 17:12
8
Như câu trả lời này cho thấy: bạn có thể sử dụng bộ lọc độc đáo:
def f7(seq): seen = set() seen_add = seen.add return [x for x in seq if not (x in seen or seen_add(x))]Và gọi với:
>>> f7(hobby for name, hobbies in input.items() for hobby in hobbies) ['running', 'engineering', 'dancing', 'art', 'theatre', 'music']Tôi sẽ thực hiện riêng bộ lọc độc đáo vì một quy tắc thiết kế nói rằng "những thứ khác nhau nên được xử lý bởi các lớp/phương thức/thành phần khác nhau/bất cứ điều gì". Hơn nữa, bạn chỉ có thể sử dụng lại phương pháp này nếu cần thiết.
Một lợi thế khác là - như được viết tại câu trả lời được liên kết - rằng thứ tự của các mục được bảo tồn. Đối với một số ứng dụng, điều này có thể là cần thiết.
Đã trả lời ngày 19 tháng 5 năm 2015 lúc 17:14May 19, 2015 at 17:14
Willem Van Onsemwillem Van OnsemWillem Van Onsem
411K29 Huy hiệu vàng389 Huy hiệu bạc511 Huy hiệu đồng29 gold badges389 silver badges511 bronze badges
10
Nếu bạn thực sự thực sự muốn một danh sách và chỉ một danh sách comp, bạn có thể làm
>>> s = [] >>> [s.append(j) for i in d.values() for j in i if j not in s] [None, None, None, None, None, None] >>> s ['dancing', 'art', 'theatre', 'running', 'engineering', 'music']Ở đây, output = [] for name, hobbies in input.items(): for hobby in hobbies: if hobby not in output: output.append(hobby) 2 là kết quả của một tác dụng phụ và output = [] for name, hobbies in input.items(): for hobby in hobbies: if hobby not in output: output.append(hobby) 3 là từ điển ban đầu của bạn. Ưu điểm duy nhất ở đây là bạn có thể bảo tồn thứ tự không giống như hầu hết các câu trả lời khác ở đây.
Lưu ý: Đây là một cách xấu vì nó khai thác danh sách comp và kết quả là một tác dụng phụ. Đừng làm điều đó như một thực hành, câu trả lời này chỉ là để cho bạn thấy rằng bạn có thể đạt được nó bằng một mình danh sách comp: This a bad way as it exploits the list-comp and the result is a side effect. Don't do it as a practice, This answer is just to show you that you can achieve it using a list comp alone
Đã trả lời ngày 19 tháng 5 năm 2015 lúc 17:21May 19, 2015 at 17:21
Bhargav Raobhargav RaoBhargav Rao
47.4K27 Huy hiệu vàng122 Huy hiệu bạc137 Huy hiệu đồng27 gold badges122 silver badges137 bronze badges
10
Khi được hỏi ngày 19 tháng 5 năm 2015 lúc 17:07
["running", "engineering", "dancing", "art", "theatre", "music"] 0Bossbalystefan BossbalystefanMay 19, 2015 at 17:17
m.wasowskim.wasowskim.wasowski
6.5329 Huy hiệu vàng51 Huy hiệu bạc81 Huy hiệu đồng1 gold badge21 silver badges30 bronze badges
2
Bạn có thể sử dụng ["running", "engineering", "dancing", "art", "theatre", "music"] 9 và đặt hiểu:
["running", "engineering", "dancing", "art", "theatre", "music"] 1Như M.Wasowski đã đề cập, chúng tôi không sử dụng output = [] for name, hobbies in input.items(): for hobby in hobbies: if hobby not in output: output.append(hobby) 0 ở đây, vì vậy chúng tôi có thể sử dụng output = [] for name, hobbies in input.items(): for hobby in hobbies: if hobby not in output: output.append(hobby) 1 thay vào đó: thay vào đó:
["running", "engineering", "dancing", "art", "theatre", "music"] 2Nếu bạn thực sự cần một danh sách làm kết quả, bạn có thể làm điều này (nhưng lưu ý rằng thông thường bạn có thể làm việc với các bộ mà không có bất kỳ vấn đề nào):May 19, 2015 at 20:24
Đã trả lời ngày 19 tháng 5 năm 2015 lúc 17:12Thijs van Dien
Như câu trả lời này cho thấy: bạn có thể sử dụng bộ lọc độc đáo:1 gold badge27 silver badges48 bronze badges
1
Và gọi với:
["running", "engineering", "dancing", "art", "theatre", "music"] 3Tôi sẽ thực hiện riêng bộ lọc độc đáo vì một quy tắc thiết kế nói rằng "những thứ khác nhau nên được xử lý bởi các lớp/phương thức/thành phần khác nhau/bất cứ điều gì". Hơn nữa, bạn chỉ có thể sử dụng lại phương pháp này nếu cần thiết.
["running", "engineering", "dancing", "art", "theatre", "music"] 4Một lợi thế khác là - như được viết tại câu trả lời được liên kết - rằng thứ tự của các mục được bảo tồn. Đối với một số ứng dụng, điều này có thể là cần thiết.
["running", "engineering", "dancing", "art", "theatre", "music"] 5
Đã trả lời ngày 19 tháng 5 năm 2015 lúc 17:14May 19, 2015 at 17:59
Willem Van Onsemwillem Van OnsemShashank
411K29 Huy hiệu vàng389 Huy hiệu bạc511 Huy hiệu đồng5 gold badges35 silver badges61 bronze badges
0
Nếu bạn thực sự thực sự muốn một danh sách và chỉ một danh sách comp, bạn có thể làm
["running", "engineering", "dancing", "art", "theatre", "music"] 6Đã trả lời ngày 19 tháng 5 năm 2015 lúc 17:12May 19, 2015 at 17:12
Như câu trả lời này cho thấy: bạn có thể sử dụng bộ lọc độc đáo:nullptr
Và gọi với:3 silver badges12 bronze badges
Tôi sẽ thực hiện riêng bộ lọc độc đáo vì một quy tắc thiết kế nói rằng "những thứ khác nhau nên được xử lý bởi các lớp/phương thức/thành phần khác nhau/bất cứ điều gì". Hơn nữa, bạn chỉ có thể sử dụng lại phương pháp này nếu cần thiết.
["running", "engineering", "dancing", "art", "theatre", "music"] 7Một lợi thế khác là - như được viết tại câu trả lời được liên kết - rằng thứ tự của các mục được bảo tồn. Đối với một số ứng dụng, điều này có thể là cần thiết.
["running", "engineering", "dancing", "art", "theatre", "music"] 8Đã trả lời ngày 19 tháng 5 năm 2015 lúc 17:14
Đã trả lời ngày 19 tháng 5 năm 2015 lúc 17:12May 19, 2015 at 17:12
Plug4Plug4Plug4
Như câu trả lời này cho thấy: bạn có thể sử dụng bộ lọc độc đáo:9 gold badges48 silver badges75 bronze badges