【问题标题】:How to remove elements of the same position from three lists if separate conditions arern't satisfied如何从三个不满足的单独条件列表中删除相同位置的元素
【发布时间】:2019-03-31 01:21:35
【问题描述】:

我有三个元组,listAlistBlistC

重要的是,在每个列表中,每个值都与其在其他两个列表中的初始对应值保持相同的索引。

我有两个条件,一个是listA,一个是listB。我希望删除 listA 中不满足 listA 条件的所有值,并删除 listB 中不满足 listB 条件的所有值,以便删除具有相同索引的所有值所有三个列表中的这些已删除值也将被删除。

如果不满足listB 条件,这将涉及从listA 等中删除一些满足listA 条件的值。所以结果是三个列表,它们的值都各自满足自己列表的条件(尽管listC 没有条件),并且这些值具有与最初相同的配对。

我已经设法通过使用 for 循环遍历列表来做到这一点,下面显示了我这样做的一个示例,对 listA 施加的条件是 x20。我知道有更优雅和 pythonic 的方法可以使用 zip 和过滤来做到这一点,但是到目前为止我还不能让它们工作。我不是一个非常有经验的程序员,所以任何帮助将不胜感激。

listA=(15,5,2,8,10,11,4,8) 
listB=(19,25,28,14,32,10,21,29)
listC=(0,9,13,4,19,51,83,13)

listAA=[]
listBB=[]
listCC=[]
for i in range(len(listA)):
    if listA[i]<10:
        if listB[i]>20:
            listAA.append(listA[i])
            listBB.append(listB[i])
            listCC.append(listC[i])
        else:
            continue
    else:
        continue
print(listAA,listBB,listCC)

【问题讨论】:

  • 很高兴你已经设法使用常规循环来做到这一点。如果您可以将代码添加到问题中,这将非常有帮助,以便我们可以从这一点开始为您提供帮助。另外,防止你的好问题被关闭。
  • 感谢您的反馈我已经添加了一个使用我使用的方法的示例。

标签: python python-3.x list filter


【解决方案1】:

如果您有多个逐项对应的列表:zip 将它们放在一起并在 zippes 上进行操作 - 然后再次压缩它们以返回您的元组:

listA = (15,5,2,8,10,11,4,8)           # not a list - it is a tupe
listB = (19,25,28,14,32,10,21,29)      # not a list - it is a tupe
listC = (0,9,13,4,19,51,83,13)         # not a list - it is a tupe

#  create positional tuples, perform tests, reverse tupling, and decompose into tuples    
A,B,C = list(zip(*filter(lambda x:x[0]<10 and x[1]>20, zip(listA,listB,listC))))

print(A)
print(B)
print(C) 

输出:

(5, 2, 4, 8)
(25, 28, 21, 29)
(9, 13, 83, 13)

独库:


zip( [1,2,3],["a","b","c"],[99,88,77] ) => ((1,"a",99),(2,"b",88),(3,"c",77)) as generator

【讨论】:

    【解决方案2】:

    重要的是,在每个列表中,每个值都与其在其他两个列表中的初始对应值保持相同的索引。

    这表明您真正拥有的是八个项目,每个项目具有三个属性。 将每个项目视为一个原子单元会更方便。 一种pythonic方法是将每个项目建模为一个元组(作为一个3元组)。 那么你会有:

    items = [(15, 19, 0),
             (5, 25, 9),
             (2, 28, 13),
             ...,
             (8, 29, 13)]
    

    现在你需要一个辅助函数,一个谓词,它会告诉我们项目是否符合某些业务规则,项目是否可以接受。

    def is_wanted(item):
        """Predicate, true for an item we wish to retain."""
        price, length, age = item  # unpack the tuple
        return (price < 10
                and length > 20)
    

    有了这个,你就可以打电话给filter()

    print(list(filter(is_wanted, items)))
    

    如果你想变得花哨,你可以考虑使用named tuple

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多