【问题标题】:removing multiple items from list of list从列表列表中删除多个项目
【发布时间】:2018-11-26 17:15:17
【问题描述】:

我需要通过以下方式从列表中删除项目: 给定两个数字:

num1 = 2
num2 = 5
#These are arbitraty (can be different than 2 or 5) 

还有名单:

[[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60], [70, 70], [80, 80], [90, 90], [100, 100]]

我需要删除这两个数字之间的所有项目,以便创建以下输出:

[[10, 10], [20, 20], [60, 60], [70, 70]]

所以保留第1个和第2个数字,删除第3个,第4个和第5个,保留第6个和第7个,其余的被删除

我试图创建一个删除项目的特定循环,但不太清楚如何遍历索引。

感谢您的帮助!

【问题讨论】:

  • 请说明您的尝试是什么。就目前而言,这太宽泛了。您的要求似乎完全武断
  • 您想删除 2 到 5 之间的元素,那么为什么要删除第 7 个以上的元素呢?请澄清
  • 这里有很多先前的问题,展示了从列表中删除项目,或从旧列表的切片中构建新列表。请显示失败的代码以及先前的答案如何不能解决您的问题。

标签: python list indexing


【解决方案1】:

您希望每 5 个项目保留前 2 个,共 5 个:

data = [[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60], [70, 70],
        [80, 80], [90, 90], [100, 100]]

num1 = 2
num2 = 5  # num2 must be > num1

new_data = [x for i,x in enumerate(data) if i%num2 < num1 ]


print(new_data)

输出:

[[10, 10], [20, 20], [60, 60], [70, 70]]

诀窍是使用enumerate() 并以num2 对原始数据的给定索引取模 - 你保留那些小于num1 的索引。

index :   0,1,2,3,4,5,6,7,8,9, ...
i%num2:   0,1,2,3,4,0,1,2,3,4, ...
keep:     x x - - - x x - - -  ...

【讨论】:

  • in (0,1) 实际上只是意味着小于 2。通过将 if i%num2 in (0,1) 替换为 if i%num2 &lt; num1 可以使解决方案变得更好。目前,如果您更改 num1,此解决方案不会更新。
  • @PatrickArtner 只是让你知道,假设这是一个错字,它现在是 if i%num2 in &lt; num1
  • @python_beginner 0 和 1 低于 2 - 这适用于 num1=2 - 使用来自 tommy 的输入修复它 - 最好像他建议的那样使用
【解决方案2】:

我不确定你的意思,但我假设你的意思是:

  1. num1num2 删除元素
  2. 删除num1 + num2之后的元素

只需使用del 运算符和列表切片:

>>> mylist = [[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60], [70, 70], [80, 80], [90, 90], [100, 100]]
>>> num1, num2 = 2, 5
>>> mylist = mylist[:num1 + num2]
>>> mylist
[[10, 10], [20, 20], [30, 30], [40, 40], [50, 50], [60, 60], [70, 70]]
>>> del mylist[num1:num2]
>>> mylist
[[10, 10], [20, 20], [60, 60], [70, 70]]

如果您的意思不同,请澄清。

【讨论】:

  • 嘿!实际上,我建议每 5 个项目保留 5 个文件中的 2 个文件@Tomothy32
猜你喜欢
  • 1970-01-01
  • 2022-12-20
  • 2015-04-13
  • 1970-01-01
  • 2016-05-08
  • 2011-03-18
  • 2021-07-19
  • 1970-01-01
相关资源
最近更新 更多