编写if语句以避免某些列表项的更好方法是什么?

时间:2019-09-06 00:14:42

标签: python python-3.x list if-statement

我有一个列表,其中我知道某些项目是不需要打印的,而我正在尝试通过if语句进行操作...但是它变得非常复杂,因此可以在if语句中包含多个索引而无需使用任何方法重写整个语句。  看起来像这样吗?: if x == chart[0,2,4]

我有的例子:

chart = ['milk', 'soda', 'cookies', 'yogurt', 'rug']

for x in chart:
    if x == chart[0] or x == chart[2] or x == chart[4]:
        continue
    else:
        print(x)

3 个答案:

答案 0 :(得分:2)

使用enumerate()可以获取索引,然后可以进行检查。

for i, x in enumerate(chart):
    if i not in {0, 2, 4}:
        print(x)

答案 1 :(得分:0)

另一个:

chart = ['milk', 'soda', 'cookies', 'yogurt', 'rug']

excluded = {chart[i] for i in (0, 2, 4)}
for x in chart:
    if x not in excluded:
        print(x)

答案 2 :(得分:0)

尽管我支持@Barmar的建议,但我认为该解决方案在charts中包含非唯一条目的情况下存在一个漏洞。例如

charts = ['milk', 'soda', 'milk', 'cookies', 'yogurt', 'rug']

以下代码段将解决charts的非唯一条目,并提供问题的要求。

discard_index = [0, 2, 4, 9]
# Keep only unique items in discard_items list
discard_items = set([chart[x] for x in discard_index if x<len(chart)]) 
for x in enumerate(chart):
    if x not in discard_items:
        print(x)
  

详细讨论

您可能要基于以下条件选择或删除元素:

  
      
  1. 索引列表:[0,2,4,]
  2.   
  3. 项目列表:['cookies','牛奶','rug',]
  4.   

如果它带有项目列表,则可以提供要丢弃的项目列表,其中某些项目甚至可能不是charts的一部分。根据索引检查有效性的条件语句要求您事先了解索引。

  

因此,无论您提供什么内容,都可以处理for循环:索引列表项目列表
  + user_discard_items = ['cookies', 'milk', 'rug', 'bananas']
  + user_discard_index = [0,2,4,9]

请注意,列表bananas中并非所有项目(9)和所有索引(chart)。

chart = ['milk', 'soda', 'cookies', 'yogurt', 'rug']
user_discard_items = ['cookies', 'milk', 'rug', 'bananas']
user_discard_index = [0,2,4,9]

如果要基于索引列表user_discard_index进行丢弃,则解决方案将是@Barmar建议的解决方案。

discard_index = user_discard_index.copy() 
for i, x in enumerate(chart):
    if i not in discard_index:
        print(x)

但是,如果charts具有非唯一项目(例如:

),则可能会导致问题
charts = ['milk', 'soda', 'milk', 'cookies', 'yogurt', 'rug']

在这种情况下,如果您对删除milk更感兴趣,则指定discard_index = (0, 2, 4)将错过第二次出现的milk。但是,如果您列出要删除的唯一项目,则可以解决此问题。除了@Barmar建议的内容以外,以下代码还处理了这种情况。

# Keep unique items for the list: discard_index
discard_index = user_discard_index.copy()
discard_items = set([chart[x] for x in discard_index if x<len(chart)])
for x in enumerate(chart):
    if x not in discard_items:
        print(x)

请注意,如果用户提供了要删除的项目列表(而不是索引),则上面的代码也适用。请参见下面的代码块。

# Keep unique items for the list: discard_items
discard_items = user_discard_items.copy()
discard_items = set(discard_items)
for x in enumerate(chart):
    if x not in discard_items:
        print(x)