Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

Tôi đã tò mò về câu hỏi: loại bỏ các bản sao liên tiếp của các yếu tố danh sách và cách thực hiện nó trong Python.

Những gì tôi nghĩ ra là:

list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
i = 0

while i < len(list)-1:
    if list[i] == list[i+1]:
        del list[i]
    else:
        i = i+1

Output:

[1, 2, 3, 4, 5, 1, 2]

Mà tôi đoán là ok.

Vì vậy, tôi đã tò mò, và muốn xem liệu tôi có thể xóa các yếu tố có các bản sao liên tiếp và nhận được đầu ra này:elements that had consecutive duplicates and get this output:

[2, 3, 5, 1, 2]

Vì điều đó tôi đã làm điều này:

list = [1,1,1,1,1,1,2,3,4,4,5,1,2]
i = 0
dupe = False

while i < len(list)-1:
    if list[i] == list[i+1]:
        del list[i]
        dupe = True
    elif dupe:
        del list[i]
        dupe = False
    else:
        i += 1

Nhưng có vẻ như vụng về và không pythonic, bạn có cách nào thông minh / thanh lịch hơn / hiệu quả hơn để thực hiện điều này không?

Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

Martineau

Huy hiệu vàng 116K2525 gold badges161 silver badges288 bronze badges

Hỏi ngày 21 tháng 4 năm 2011 lúc 2:39Apr 21, 2011 at 2:39

1

>>> L = [1,1,1,1,1,1,2,3,4,4,5,1,2]
>>> from itertools import groupby
>>> [key for key, _group in groupby(L)]
[1, 2, 3, 4, 5, 1, 2]

Cho phần thứ hai

>>> [k for k, g in groupby(L) if len(list(g)) < 2]
[2, 3, 5, 1, 2]

Nếu bạn không muốn tạo danh sách tạm thời chỉ để có độ dài, bạn có thể sử dụng tổng thể qua biểu thức máy phát

>>> [k for k, g in groupby(L) if sum(1 for i in g) < 2]
[2, 3, 5, 1, 2]

Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

wjandrea

25.2k8 Huy hiệu vàng54 Huy hiệu bạc75 Huy hiệu Đồng8 gold badges54 silver badges75 bronze badges

Đã trả lời ngày 21 tháng 4 năm 2011 lúc 2:45Apr 21, 2011 at 2:45

Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

John La Rooyjohn La RooyJohn La Rooy

288K51 Huy hiệu vàng359 Huy hiệu bạc501 Huy hiệu đồng51 gold badges359 silver badges501 bronze badges

6

Oneliner trong Python thuần túy

[v for i, v in enumerate(your_list) if i == 0 or v != your_list[i-1]]

Đã trả lời ngày 27 tháng 10 năm 2017 lúc 14:18Oct 27, 2017 at 14:18

Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

Ulf Aslakulf AslakUlf Aslak

7.3683 Huy hiệu vàng34 Huy hiệu bạc55 Huy hiệu Đồng3 gold badges34 silver badges55 bronze badges

0

Nếu bạn sử dụng Python 3.8+, bạn có thể sử dụng biểu thức gán

[1, 2, 3, 4, 5, 1, 2]
8:

list1 = [1, 2, 3, 3, 4, 3, 5, 5]

prev = object()
list1 = [prev:=v for v in list1 if prev!=v]

print(list1)

Prints:

[1, 2, 3, 4, 3, 5]

Đã trả lời ngày 13 tháng 7 năm 2020 lúc 19:26Jul 13, 2020 at 19:26

Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

Andrej Keselyandrej KeselyAndrej Kesely

Phù bằng vàng 144K1414 gold badges45 silver badges88 bronze badges

Một cách tiếp cận "lười biếng" sẽ là sử dụng

[1, 2, 3, 4, 5, 1, 2]
9.

[1, 2, 3, 4, 5, 1, 2]
0

đầu ra

[1, 2, 3, 4, 3, 5]

Đã trả lời ngày 13 tháng 7 năm 2020 lúc 19:26Jul 13, 2020 at 19:26

Andrej Keselyandrej KeselyDeepSpace

Phù bằng vàng 144K1411 gold badges102 silver badges143 bronze badges

Một cách tiếp cận "lười biếng" sẽ là sử dụng

[1, 2, 3, 4, 5, 1, 2]
9.

[1, 2, 3, 4, 5, 1, 2]
2

Đã trả lời ngày 13 tháng 7 năm 2020 lúc 19:26Jul 13, 2020 at 19:26

Andrej Keselyandrej KeselyGeno C

Phù bằng vàng 144K143 gold badges10 silver badges26 bronze badges

Một cách tiếp cận "lười biếng" sẽ là sử dụng

[1, 2, 3, 4, 5, 1, 2]
9.

[1, 2, 3, 4, 5, 1, 2]
3

đầu ra

DeepSpacedeepspaceApr 18, 2019 at 22:59

Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

75.9K11 Huy hiệu vàng102 Huy hiệu bạc143 Huy hiệu đồngOleg Melnikov

Bạn có thể làm điều này bằng cách sử dụng khả năng hiểu

[2, 3, 5, 1, 2]
0 +.2 gold badges32 silver badges63 bronze badges

Geno cgeno c

[1, 2, 3, 4, 5, 1, 2]
4

1.3833 huy hiệu vàng10 Huy hiệu bạc26 Huy hiệu đồng

Dưới đây là một giải pháp mà không phụ thuộc vào các gói bên ngoài:7 gold badges62 silver badges70 bronze badges

Sau đó, tôi lưu ý rằng giải pháp tương tự của Ulf Aslak là sạch hơn :)Dec 13, 2016 at 20:43

Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

Đã trả lời ngày 18 tháng 4 năm 2019 lúc 22:59Moinuddin Quadri

Oleg Melnikovoleg Melnikov12 gold badges94 silver badges121 bronze badges

2.9412 Huy hiệu vàng32 Huy hiệu bạc63 Huy hiệu Đồng

[1, 2, 3, 4, 5, 1, 2]
5

đầu ra

[1, 2, 3, 4, 3, 5]

1.3833 huy hiệu vàng10 Huy hiệu bạc26 Huy hiệu đồng

Dưới đây là một giải pháp mà không phụ thuộc vào các gói bên ngoài:7 gold badges62 silver badges70 bronze badges

Sau đó, tôi lưu ý rằng giải pháp tương tự của Ulf Aslak là sạch hơn :)Jul 13, 2020 at 19:34

Đã trả lời ngày 18 tháng 4 năm 2019 lúc 22:59plum 0

Oleg Melnikovoleg Melnikov8 silver badges20 bronze badges

2.9412 Huy hiệu vàng32 Huy hiệu bạc63 Huy hiệu Đồng

[1, 2, 3, 4, 5, 1, 2]
7

Để loại bỏ các bản sao liên tiếp của các yếu tố danh sách; Thay vào đó, bạn có thể sử dụng

[2, 3, 5, 1, 2]
1 với danh sách hiểu như:Jan 5, 2020 at 12:21

Hướng dẫn how do i get rid of consecutive duplicates in python? - làm cách nào để loại bỏ các bản sao liên tiếp trong python?

GeorgyYuri Feldman

11.1k7 Huy hiệu vàng62 Huy hiệu bạc70 Huy hiệu đồng1 gold badge19 silver badges23 bronze badges