【问题标题】:Exclude an element in a list [duplicate]排除列表中的元素[重复]
【发布时间】:2021-02-26 20:35:56
【问题描述】:

是否可以在列表中的特定元素上使用切片?例如a = [1,2,3,4,5,6,7,8,9] 我想创建一个for 循环来打印除第二个元素之外的整个列表。

我想做这样的事情:

for i in a[something_slice]: 
    print(i)

这可能吗?

【问题讨论】:

  • 不,切片不是这样工作的,尽管打印除第二个元素之外的所有元素很容易。这是 R 比 Python 更灵活的少数几个领域之一。
  • @Aplet123 似乎是一个家庭作业,其中 OP 对第一个答案不满意。另一方面,这可能是同一个班级的两个学生。

标签: python arrays python-3.x list slice


【解决方案1】:

对于仅排除一个元素,@Applet123 提出的 2 切片 lst[:i] + lst[i + 1:] 方法可能是最快的(或者可能是 excluded = lst.pop(1) 提取排除的元素,for x in lst: print(x) 用于打印所有其他元素;然后是 lst.insert(1,excluded)将排除的元素放回列表中。有关详细信息,请参阅data structures docs。

如果您只是想过滤掉某些索引,而不是 for 循环,我建议您使用基于 list comprehensionsenumerate 的更 Pythonic(和直观)的方法:

myList = [1,2,3,4,5,6,7,8,9]
excludedIndices = [1]
myFilteredList = [x for i, x in enumerate(myList) if i not in excludedIndices]
print (myFilteredList)

# output:
# [1,3,4,5,6,7,8,9]

# or, to actually print each element individually:
for x in myFilteredList:
  print (x)

# which can also work as a 2-liner with inline filtering:
for i, x in enumerate(myList):
  if i not in excludedIndices: print(x)

还可以查看 filtermap 内置函数的 python 用法,这对于此目的可能有点过头,但仍为此类处理提供了通用且更强大的解决方案:

# filters an enumerated element 
def myFilter(element): 
  return element[0] not in excludedIndices

# maps an enumerated element to a function 
def myMap(element): 
  print(element[1])
  
# runs myMap function for each enumerated element on the list filtered by myFilter
for x in map(myMap,filter(myFilter,enumerate(myList))): pass

您也可以使用lambda expressions 将其变成单线:

for x in map(lambda x: print(x[1]),filter(lambda x: x[0] not in excludedIndices,enumerate(myList))): pass

【讨论】:

    【解决方案2】:

    如果你真的想对列表进行切片,可以使用 2 个切片围绕它进行切片:

    def exclude(lst, i):
        return lst[:i] + lst[i + 1:]
    
    exclude([1, 2, 3, 4, 5], 1) # [1, 3, 4, 5]
    

    如果你只想循环遍历它,你也可以在索引达到你想要跳过的值时跳过:

    for i, v in enumerate(a):
        if i == 1:
            continue
        print(v)
    

    【讨论】:

      【解决方案3】:

      你可以不用切片,使用 enumerate()

      index_to_skip=1
      for idx,item in enumerate(a):
          if idx!=index_to_skip:
              print(item)
      

      【讨论】:

      • 问题是我的列表包含一个类的属性。您的方法有效,但是我想添加条件,以便它可以打印出我需要的内容并考虑到我跳过了一个元素
      猜你喜欢
      • 1970-01-01
      • 2014-12-17
      • 2020-01-19
      • 2020-08-02
      • 2020-11-02
      • 2018-05-02
      • 2014-07-06
      • 2014-02-17
      • 1970-01-01
      相关资源
      最近更新 更多