Hướng dẫn can a list in python have repeated elements? - một danh sách trong python có thể có các phần tử lặp lại không?

Bạn có thể sử dụng iteration_utilities.duplicates:

>>> from iteration_utilities import duplicates

>>> list(duplicates([1,1,2,1,2,3,4,2]))
[1, 1, 2, 2]

Hoặc nếu bạn chỉ muốn một trong mỗi bản sao, điều này có thể được kết hợp với iteration_utilities.unique_everseen:

>>> from iteration_utilities import unique_everseen

>>> list(unique_everseen(duplicates([1,1,2,1,2,3,4,2])))
[1, 2]

Nó cũng có thể xử lý các yếu tố không thể đo lường được (tuy nhiên với chi phí hiệu suất):

>>> list(duplicates([[1], [2], [1], [3], [1]]))
[[1], [1]]

>>> list(unique_everseen(duplicates([[1], [2], [1], [3], [1]])))
[[1]]

Đó là điều mà chỉ một vài cách tiếp cận khác ở đây có thể xử lý.

Điểm chuẩn

Tôi đã làm một điểm chuẩn nhanh chóng chứa hầu hết (nhưng không phải tất cả) các phương pháp được đề cập ở đây.

Điểm chuẩn đầu tiên chỉ bao gồm một phạm vi nhỏ các độ dài danh sách vì một số phương pháp có hành vi O(n**2).

Trong các biểu đồ, trục y biểu thị thời gian, do đó giá trị thấp hơn có nghĩa là tốt hơn. Nó cũng được vẽ log-log để phạm vi rộng của các giá trị có thể được hiển thị tốt hơn:

Hướng dẫn can a list in python have repeated elements? - một danh sách trong python có thể có các phần tử lặp lại không?

Loại bỏ các phương pháp O(n**2) Tôi đã thực hiện một điểm chuẩn khác lên đến nửa triệu yếu tố trong danh sách:

Hướng dẫn can a list in python have repeated elements? - một danh sách trong python có thể có các phần tử lặp lại không?

Như bạn có thể thấy phương pháp iteration_utilities.duplicates nhanh hơn bất kỳ phương pháp nào khác và thậm chí chuỗi

>>> from iteration_utilities import unique_everseen

>>> list(unique_everseen(duplicates([1,1,2,1,2,3,4,2])))
[1, 2]
1 nhanh hơn hoặc nhanh hơn so với các phương pháp khác.

Một điều thú vị khác cần lưu ý ở đây là các phương pháp Pandas rất chậm đối với các danh sách nhỏ nhưng có thể dễ dàng cạnh tranh cho các danh sách dài hơn.

Tuy nhiên, vì các điểm chuẩn này cho thấy hầu hết các phương pháp thực hiện gần như như nhau, do đó, không quan trọng là loại nào được sử dụng (ngoại trừ 3 lần chạy O(n**2)).

from iteration_utilities import duplicates, unique_everseen
from collections import Counter
import pandas as pd
import itertools

def georg_counter(it):
    return [item for item, count in Counter(it).items() if count > 1]

def georg_set(it):
    seen = set()
    uniq = []
    for x in it:
        if x not in seen:
            uniq.append(x)
            seen.add(x)

def georg_set2(it):
    seen = set()
    return [x for x in it if x not in seen and not seen.add(x)]   

def georg_set3(it):
    seen = {}
    dupes = []

    for x in it:
        if x not in seen:
            seen[x] = 1
        else:
            if seen[x] == 1:
                dupes.append(x)
            seen[x] += 1

def RiteshKumar_count(l):
    return set([x for x in l if l.count(x) > 1])

def moooeeeep(seq):
    seen = set()
    seen_add = seen.add
    # adds all elements it doesn't know yet to seen and all other to seen_twice
    seen_twice = set( x for x in seq if x in seen or seen_add(x) )
    # turn the set into a list (as requested)
    return list( seen_twice )

def F1Rumors_implementation(c):
    a, b = itertools.tee(sorted(c))
    next(b, None)
    r = None
    for k, g in zip(a, b):
        if k != g: continue
        if k != r:
            yield k
            r = k

def F1Rumors(c):
    return list(F1Rumors_implementation(c))

def Edward(a):
    d = {}
    for elem in a:
        if elem in d:
            d[elem] += 1
        else:
            d[elem] = 1
    return [x for x, y in d.items() if y > 1]

def wordsmith(a):
    return pd.Series(a)[pd.Series(a).duplicated()].values

def NikhilPrabhu(li):
    li = li.copy()
    for x in set(li):
        li.remove(x)

    return list(set(li))

def firelynx(a):
    vc = pd.Series(a).value_counts()
    return vc[vc > 1].index.tolist()

def HenryDev(myList):
    newList = set()

    for i in myList:
        if myList.count(i) >= 2:
            newList.add(i)

    return list(newList)

def yota(number_lst):
    seen_set = set()
    duplicate_set = set(x for x in number_lst if x in seen_set or seen_set.add(x))
    return seen_set - duplicate_set

def IgorVishnevskiy(l):
    s=set(l)
    d=[]
    for x in l:
        if x in s:
            s.remove(x)
        else:
            d.append(x)
    return d

def it_duplicates(l):
    return list(duplicates(l))

def it_unique_duplicates(l):
    return list(unique_everseen(duplicates(l)))

Điểm chuẩn 1

from simple_benchmark import benchmark
import random

funcs = [
    georg_counter, georg_set, georg_set2, georg_set3, RiteshKumar_count, moooeeeep, 
    F1Rumors, Edward, wordsmith, NikhilPrabhu, firelynx,
    HenryDev, yota, IgorVishnevskiy, it_duplicates, it_unique_duplicates
]

args = {2**i: [random.randint(0, 2**(i-1)) for _ in range(2**i)] for i in range(2, 12)}

b = benchmark(funcs, args, 'list size')

b.plot()

Điểm chuẩn 2

funcs = [
    georg_counter, georg_set, georg_set2, georg_set3, moooeeeep, 
    F1Rumors, Edward, wordsmith, firelynx,
    yota, IgorVishnevskiy, it_duplicates, it_unique_duplicates
]

args = {2**i: [random.randint(0, 2**(i-1)) for _ in range(2**i)] for i in range(2, 20)}

b = benchmark(funcs, args, 'list size')
b.plot()

Tuyên bố miễn trừ trách nhiệm

1 Đây là từ một thư viện của bên thứ ba tôi đã viết:

>>> from iteration_utilities import unique_everseen

>>> list(unique_everseen(duplicates([1,1,2,1,2,3,4,2])))
[1, 2]
3.

Một danh sách có thể có các giá trị lặp đi lặp lại?

Bản sao trong danh sách là gì? Nếu một số nguyên hoặc chuỗi hoặc bất kỳ mục nào trong danh sách được lặp lại nhiều lần, chúng là các bản sao.If an integer or string or any items in a list are repeated more than one time, they are duplicates.

Làm thế nào để bạn lặp lại một yếu tố trong một danh sách trong Python?

Toán tử * cũng có thể được sử dụng để lặp lại các yếu tố của một danh sách.Khi chúng tôi nhân danh sách với bất kỳ số nào bằng toán tử *, nó sẽ lặp lại các phần tử của danh sách đã cho.Ở đây, chúng ta chỉ cần nhớ rằng để lặp lại các yếu tố n lần, chúng ta sẽ phải nhân danh sách với (n+1).. When we multiply a list with any number using the * operator, it repeats the elements of the given list. Here, we just have to keep in mind that to repeat the elements n times, we will have to multiply the list by (n+1).

Sự lặp lại của danh sách trong Python là gì?

Toán tử lặp lại tạo ra nhiều bản sao của một danh sách và kết hợp tất cả chúng lại với nhau.Định dạng chung là: list * n, trong đó danh sách là danh sách và n là số lượng bản sao để tạo.Trong ví dụ này, [0] là một danh sách có một phần tử, 0.. The general format is: list * n, where list is a list, and n is the number of copies to make. In this example, [0] is a list with one element, 0.

Làm thế nào để bạn tìm thấy một yếu tố lặp đi lặp lại trong một danh sách?

Kiểm tra các bản sao trong một danh sách bằng cách sử dụng Set & bằng cách so sánh kích thước..
Thêm nội dung của danh sách trong một bộ.Vì tập hợp chỉ chứa các yếu tố duy nhất, do đó sẽ không có bản sao nào được thêm vào tập hợp ..
So sánh kích thước của bộ và danh sách.Nếu kích thước của danh sách & bộ bằng nhau thì điều đó có nghĩa là không có bản sao trong danh sách ..