新的不重复元素列表
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']
我想创建一个以 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']