2012-10-01 37 views
7

Có cách nào để thực hiện việc hiểu danh sách bằng Python chỉ chứa các mục duy nhất không?Đọc danh sách Python, với các mục duy nhất

ý tưởng ban đầu của tôi là sử dụng một cái gì đó như thế này: new_items = [unicode(item) for item in items]

Tuy nhiên, sau đó tôi nhận ra rằng tôi cần thiết để bỏ qua mục trùng lặp. Vì vậy, tôi đã kết thúc với con quái vật xấu xí này:

unique_items = [] 
for item in items : 
    unicode_item = unicode(item) 
    if unicode_item not in unique_items : 
     unique_items.append(unicode_item) 

Bây giờ đây là ít khá (và có thể đọc được) so với một danh sách hiểu đơn giản. Vì vậy, có cách nào để làm cho một danh sách hiểu tương đương với mã trên?

Đơn đặt hàng cũng quan trọng, vì vậy tôi không thể chỉ sử dụng thiết lập hiểu.

+0

Thú vị, suy nghĩ ban đầu của tôi là bạn có thể làm lọc trong comprehensions danh sách, nhưng sau đó tôi nhận ra bạn muốn cần truy cập vào danh sách mới mà bạn đang tạo trong điều kiện bộ lọc. – Davy8

+0

Nếu đơn đặt hàng quan trọng, làm cách nào để biết trường hợp của một mục lặp lại để sử dụng? Người đầu tiên, người cuối cùng, hoặc một ở giữa? – lvella

+1

có thể trùng lặp của [Làm thế nào để bạn loại bỏ các bản sao từ một danh sách bằng Python trong khi vẫn giữ trật tự?] (Http://stackoverflow.com/questions/480214/how-do-you-remove-duplicates-from-a-list-in -python-while-preserving-order) – mgilson

Trả lời

17

Vâng, không có tập có thứ tự, nhưng chúng ta có thể lạm dụng OrderedDict:

from collections import OrderedDict 
t = "never gonna give you up" 
OrderedDict.fromkeys(t).keys() 

Cung cấp:

['n', 'e', 'v', 'r', ' ', 'g', 'o', 'a', 'i', 'y', 'u', 'p'] 
+0

Ồ, rất đẹp. Trên một lưu ý phụ, hãy thử sử dụng 'repeat (None)' từ 'itertools' thay vì' [None] * len (t) ' – Dunes

+3

Làm thế nào về' OrderedDict.fromkeys (t) .keys() 'thay thế? [Lưu ý rằng cách tiếp cận này, cũng như cách tiếp cận đã đặt, giới hạn chúng tôi thành các phần tử có thể băm.] – DSM

+0

Vâng, tốt hơn. Cảm ơn bạn đã đề xuất! – Michael

4

Biến nó thành chức năng trợ giúp, như vậy.

def unique_iter(iterable): 
    seen = set() 
    for item in iterable: 
    if item in seen: 
     continue 
    seen.add(item) 
    yield item 

for ch in unique_iter("never gonna give you up"): 
    print ch, 

đầu ra

nevrgoaiyup

6

tôi ngắn lót có thể là:

s = "some string" 
unique_items = [unicode(ch) for ch in sorted(set(s), key=s.index)] 
+1

Hoạt động nhưng không hiệu quả đối với các danh sách lớn hơn. – l4mpi

+1

Không, nhưng nó ngắn và dễ hiểu ý định của nó. – Dunes

7

ý tưởng ban đầu của bạn làm việc với một bộ hiểu:

new_items = {unicode(item) for item in items} 
Các vấn đề liên quan