2013-04-04 32 views
7

Tôi biết đây có lẽ là một câu trả lời dễ dàng nhưng tôi không thể hiểu được.Giữ các bản sao trong một danh sách bằng Python

x = [1,2,2,2,3,4,5,6,6,7] 

Sản lượng nên là::

[2,6] 

Tôi thấy liên kết này: cách tốt nhất bằng Python để giữ các bản sao trong danh sách là gì Find (and keep) duplicates of sublist in python, nhưng tôi vẫn còn tương đối mới để Python và tôi không thể làm cho nó hoạt động cho một danh sách đơn giản.

+0

Các bạn đã thử một trong những một lớp lót trong bài viết đó? –

+0

Bạn có cần phải giữ gìn trật tự? – DSM

+0

@DSM - Có vẻ như chúng tôi đang suy nghĩ cùng một điều ... – mgilson

Trả lời

8

Đây là một cách ngắn để làm điều đó nếu danh sách được sắp xếp đã:

x = [1,2,2,2,3,4,5,6,6,7] 

from itertools import groupby 
print [key for key,group in groupby(x) if len(list(group)) > 1] 
+1

Điều này cũng sẽ làm việc với python2.6 mà là một vấn đề với tôi. – mgilson

+0

sẽ làm việc này ngay cả với một danh sách không có thứ tự? – luchosrock

+0

@luchosrock: Không, 'nhóm nhóm' các phần tử liên tiếp –

12

Tôi muốn sử dụng một collections.Counter:

from collections import Counter 
x = [1, 2, 2, 2, 3, 4, 5, 6, 6, 7] 
counts = Counter(x) 
output = [value for value, count in counts.items() if count > 1] 

Đây là một phiên bản mà giữ trật tự khi mục được sao chép đầu tiên chỉ giả định rằng chuỗi được chuyển trong chứa các mục có thể băm và nó sẽ hoạt động trở lại khi set hoặc yeild được giới thiệu với ngôn ngữ (bất cứ khi nào có).

def keep_dupes(iterable): 
    seen = set() 
    dupes = set() 
    for x in iterable: 
     if x in seen and x not in dupes: 
      yield x 
      dupes.add(x) 
     else: 
      seen.add(x) 

print list(keep_dupes([1,2,2,2,3,4,5,6,6,7])) 
+0

Tuy nhiên, bạn mất thứ tự của các phần tử trong đầu ra. –

+0

Đúng. Có rất nhiều tình huống mà đây không phải là cách tốt nhất để đi. Nó cũng yêu cầu đầu vào được hashable ... Nhưng, nó là O (n) ngay cả đối với các danh sách chưa được sắp xếp mà là tốt đẹp. – mgilson

+0

Biến thể đặt hàng ngắn nhất mà tôi có thể nghĩ ra là '[k cho k trong OrderedDict.fromkeys (x) nếu đếm [k]> 1]'. – DSM

0

keepin' cho nó đơn giản:

array2 = [] 
aux = 0 
aux2=0 
for i in x: 
    aux2 = i 
    if(aux2==aux): 
     array2.append(i) 
    aux= i 
list(set(array2)) 

Nên hoạt động

+0

Sẽ không cung cấp cho '[2,2,6]'? – DSM

+0

@ DSM ahaha bạn hoàn toàn đúng, tôi đã chỉnh sửa câu trả lời của tôi, Cảm ơn :) – luchosrock

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