在python中压缩多个if语句

时间:2016-09-10 15:07:25

标签: python list loops if-statement

我正在尝试编写一个函数来检查是否在多个列表中找到了一个对象,并从其找到的任何列表中删除该对象。我想知道是否有办法使它更干净或更智能使用一些通用变量的形式,您可以预定义这些行的格式或其他内容。 我的代码以丑陋的形式出现:

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)

我希望它适用于每个列表,我需要循环吗?任何建议都会很棒!我有解决方法,但我很想学习一种更优雅的编码方式!

4 个答案:

答案 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找到的第一个匹配项。因此,这取决于列表是否可能包含重复项目,需要删除(全部):

1。如果所有列表中的所有项目都是唯一的

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"]

然而

2。如果一个或多个列表可能包含重复项

在这种情况下,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)