如何优化代码以删除列表中所有列表的第n个位置

3

我在网站上搜索了这个问题,并找到了许多关于从列表中删除特定值的帖子。

然而,这并没有回答我的问题。

让我们来看一个例子:

mylist=[[1,2,3,4],[100,374,283,738]]

现在,我心中认为这两个列表是相互关联的。列表1包含数字项目:1、2、3、4等等,而列表2则是这些项目的特征(例如价格:$100、$374等)。
现在,如果列表2中的某个值更高(例如某件商品太昂贵,超过了$300),我想要从列表中删除这些元素(数字和价格)。
我一直在尝试,得到了以下代码:
n=0 # counter for position in the list
for i in mylist[1]:
    if i>300:
        for j in mylist:
            del j[n]
    n=n+1

结果:

[[1,3],[100,283]]

这个方法实际上是可行的。看起来不太高效:我需要多次访问列表并创建新变量。循环太多。

由于列表可以使用推导式,我想知道是否有更有效和更优雅的方法来获得相同的结果。

谢谢

4个回答

3

使用带有过滤生成器表达式的 zip

>>> mylist = [[1,2,3,4], [100,374,283,738]]
>>> mylist[:] = list(map(list, zip(*((a,b) for a,b in zip(*mylist) if b<300))))
>>> mylist
[[1, 3], [100, 283]]

请注意,这会保留旧的mylist指针,以模仿您的代码修改原始列表的方式。

我对所有带有答案评论感到印象深刻。这些都是获得相同结果的好方法,比我提出的方式都要好。我投了所有人一票。然而,这种方式恰恰是我正在寻找的。首先,因为它似乎非常高效,并返回修改后的相同列表。我没有完全理解它,但我会继续努力学习。 - daniel_hck

2

看起来你想将mylist [0]的元素映射到mylist [1]的元素。如果是这样,我建议使用字典。将数据移入其中,你的脚本可能如下所示:

mydict = { 1: 100, 2: 374, 3: 283, 4: 738 }

mykeys = list(mydict.keys())
for key in mykeys():
    if dict[key] > 300:
        del dict[key]

这段代码有点啰嗦,我们需要将键复制到列表中,因为我们不能在循环遍历其键时修改字典。然而,有一种短的单行替代方案,可能正是您要寻找的类型。

推导式也可以与字典一起使用。对于此示例,它看起来像:

mydict = { k: mydict[k] for k in mydict.keys() if mydict[k] <= 300 }

编辑: 我的原始答案存在一些语法问题,但是更正后的代码片段应该可以工作。


1

考虑到您只是想检查价格,让我们继续制作一个简单的循环:

mylist=[[1,2,3,4],[100,374,283,738]]
print [item for item in zip(*mylist) if item[1] <= 300]

1

如果您可以使用numpy,可以尝试以下代码:

>>> import numpy as np
>>> mylist=[[1,2,3,4],[100,374,283,738]]
>>> arr = np.array(mylist)
>>> price = np.array(mylist[1])
>>> np.delete(arr, np.where(price>=300), 1).tolist()
[[1, 3], [100, 283]]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接