新的不重复元素列表

New list of not repeated elements

我想创建一个以 lsit 作为参数的函数,例如:

list = ['a','b','a','d','e','f','a','b','g','b']

和 returns 特定数量的列表元素(我选择了数字)使得没有数字出现两次。例如,如果我选择 3:

 new_list = ['a','b','d']

我尝试了以下方法:

def func(j, list):
    new_list=[]
    for i in list:
        while(len(new_list)<j):
            for k in new_list:
                if i != k:
                    new_list.append(i)
                    
                    return new_list

但是这个函数进入了无限循环。

试试这个。


lst = ['a','b','a','d','e','f','a','b','g','b']

j = 3

def func(j,list_):
    new_lst = []
    for a in list_:
        if a not in new_lst:
            new_lst.append(a)

    return new_lst[:j]

print(func(j,lst)) # ['a', 'b', 'd']

list是python中的保留字。

如果元素的顺序不是问题,那么

def func(j, user_list):
    return list(set(user_list))[:j]

使用“list”作为变量名是不好的做法

你可以使用 python

中的计数器库来解决问题
from collections import Counter
a=['a','b','a','d','e','f','a','b','g','b']

b = list(Counter(a))

print(b[:3])

所以你的函数应该是这样的

def unique_slice(list_in, elements):
    new_list = list(Counter(list_in))
    print("New list: {}".format(new_list))
    if int(elements) <= len(new_list):
            return new_list[:elements]
    return new_list

希望它能解决您的问题

def func(j, mylist):
    # dedup, preserving order (dict is insertion-ordered as a language guarantee as of 3.7):
    deduped = list(dict.fromkeys(mylist))
    # Slice off all but the part you care about:
    return deduped[:j]

如果大输入的性能是一个问题,那是次优的(它处理整个输入,即使 j 唯一元素在输入的第一个 j 索引中找到,其中 j 比输入小得多),因此可以使用更复杂的解决方案以获得最大效率。首先,复制the itertools unique_everseen recipe:

from itertools import filterfalse, islice  # At top of file, filterfalse for recipe, islice for your function

def unique_everseen(iterable, key=None):
    "List unique elements, preserving order. Remember all elements ever seen."
    # unique_everseen('AAAABBBCCDAABBB') --> A B C D
    # unique_everseen('ABBCcAD', str.lower) --> A B C D
    seen = set()
    seen_add = seen.add
    if key is None:
        for element in filterfalse(seen.__contains__, iterable):
            seen_add(element)
            yield element
    else:
        for element in iterable:
            k = key(element)
            if k not in seen:
                seen_add(k)
                yield element

现在包装它 with islice 以仅提取所需数量的元素并在拥有它们后立即退出(根本不处理其余输入):

def func(j, mylist):  # Note: Renamed list argument to mylist to avoid shadowing built-in
    return list(islice(unique_everseen(mylist), j))

正如其他人所说,您不应该 Shadow built-in name 'list'。因为这可能会导致很多问题。这是一个简单的问题,您应该添加到新列表并检查元素是否已添加。

python 中的 [:] 运算符可让您沿索引分隔列表。

>>>l = [1, 2, 3, 4]
>>>l[:1]
[1]
>>>l[1:]
[2, 3, 4]

lst = ['a', 'b', 'a', 'd', 'e', 'f', 'a', 'b', 'g', 'b']


def func(number, _list):
    out = []
    for a in _list:
        if a not in out:
            out.append(a)

    return out[:number]


print(func(4, lst))  # ['a', 'b', 'd', 'e']