我正在尝试编写一个函数来检查是否在多个列表中找到了一个对象,并从其找到的任何列表中删除该对象。我想知道是否有办法使它更干净或更智能使用一些通用变量的形式,您可以预定义这些行的格式或其他内容。 我的代码以丑陋的形式出现:
def create_newlist(choice):
if choice in list_a:
list_a.remove(choice)
if choice in list_b:
list_b.remove(choice)
if choice in list_c:
list_c.remove(choice)
if choice in list_d:
list_d.remove(choice)
if choice in list_e:
list_e.remove(choice)
我希望的是:
if choice in list_x:
list_x.remove(choice)
我希望它适用于每个列表,我需要循环吗?任何建议都会很棒!我有解决方法,但我很想学习一种更优雅的编码方式!
答案 0 :(得分:6)
如何创建列表并循环遍历?
类似的东西:
lists = [list_a, list_b, list_c, list_d, list_e]
for lst in lists:
if choice in lst:
lst.remove(choice)
答案 1 :(得分:3)
如果您使用some_list.remove(item)
,则只会从列表中删除item
找到的第一个匹配项。因此,这取决于列表是否可能包含重复项目,需要删除(全部):
list1 = ["a", "b" , "c", "d"]
list2 = ["k", "l", "m", "n"]
list3 = ["c", "b", "a", "e"]
[l.remove("a") for l in [list1, list2, list3] if "a" in l]
print(list3)
> ["c", "b", "e"]
然而
在这种情况下,itertools
'filterfalse()会派上用场:
from itertools import filterfalse
def remove_val(val, lists):
return [list(filterfalse(lambda w: w == val, l)) for l in lists]
l1 = ["a", "b" , "c", "d"]
l2 = ["k", "l", "m", "n"]
l3 = ["a", "c", "b", "a", "a", "e"]
newlists = remove_val("a", [l1, l2, l3])
然后测试:
print(newlists)
> [['b', 'c', 'd'], ['k', 'l', 'm', 'n'], ['c', 'b', 'e']]
答案 2 :(得分:2)
让您的list_x
列出所有列表
然后这样做
for each in list_x:
if choice in each:
# if is actually not required
each.remove(choice)
答案 3 :(得分:0)
前一个建议的替代方法是更加清晰,它是定义辅助函数。所以,而不是:
def create_newlist(choice):
if choice in list_a:
list_a.remove(choice)
if choice in list_b:
list_b.remove(choice)
if choice in list_c:
list_c.remove(choice)
if choice in list_d:
list_d.remove(choice)
if choice in list_e:
list_e.remove(choice)
你有:
def create_newlist(_list, choice):
if choice in _list:
_list.remove(choice)
lists = [list_a, list_b, list_c, list_d, list_e]
for _lst in lists:
create_newlist(_lst, choice)