【问题标题】:Python remove specific elements from list on repeated stepsPython在重复步骤中从列表中删除特定元素
【发布时间】:2017-06-22 15:25:20
【问题描述】:

我有一个包含 n 个元素的列表(可被 56 整除)。从 56 个元素的每个“步骤”中,我想在每个步骤中删除相同索引上的特定元素:。假设我有一个包含 280 个元素的列表,我想将它分隔为 56 个元素,这将是 5 个列表。并从每个列表中删除特定的索引(例如下面的索引变量)。

index = [1, 8, 14, 21, 28, 35, 42, 49]

my_list = ['4','5', '3', '7'.... '1'] #at least 56 elements
len(my_list) # Out: 280, for example
new_l = []


for i in my_list[0:56]:
     if i not in index:
        new_l.append(i)

我想通过 my_list 反复迭代一个包含 56 个元素的步骤,并从索引变量中删除这些特定索引。提前致谢,愿原力与您同在!

【问题讨论】:

  • step,我认为您的意思是 slice。两者不能互换使用。
  • 举一个真实的、简化的例子。也许是 20 个元素的列表和 7 个或类似的步骤。给出示例输入和输出,因为您想要的结果不清楚。

标签: python list python-3.x loops


【解决方案1】:

您似乎正在尝试同时对列表进行分块和过滤。

indices = [1, 3, 5]
s = 6
t = list(range(30))

[[v for j, v in enumerate(t[i:i+s]) if j not in indices] for i in range(0, len(t), s)]
# [[0, 2, 4], [6, 8, 10], [12, 14, 16], [18, 20, 22], [24, 26, 28]]

【讨论】:

  • 就是这样,伙计。感谢您抓住我的想法,即使我无法很好地解释它们:)
【解决方案2】:

使用列表推导enumerate 同时生成索引和项目。对 56 取索引的 会得到一个介于 0 和 55 之间的数字,可用于根据 index 列表中的值进行过滤:

new_l = [x for i, x in enumerate(my_list) if i%56 not in index]

请记住,索引从 0 开始。如果您的 index 列表没有考虑到这一点,您可以将 1 的 start 传递给 enumerate

专业提示:将index 列出一个集合会将成员查找复杂度降低到O(1)。

【讨论】:

  • 谢谢伙计,但事实并非如此。假设我的 my_list 中有 224 个元素。我想从 [0:56] 开始迭代,并在每次迭代时删除与索引列表对应的元素。
  • 您只想检查切片[0:56]一次还是多次?
  • 是的,重复:)
  • @HristoStoychev 好吧,这就是答案的作用。您不需要切片,只需使用 mod 56 折叠当前索引即可:)
【解决方案3】:

我不完全确定我是否理解您的问题。按照我的理解,您想从index 列表中删除my_list 中的每56 个元素。如果这是正确的,您应该使用切片[0::56],而不是[0:56]。后者将为您提供前 56 个元素。

这是一个简化的示例,删除每个第二个元素,两个列表相同,因此更容易跟踪正在发生的事情:

>>> index = [1, 8, 14, 21, 28, 35, 42, 49]
>>> my_list = [1, 8, 14, 21, 28, 35, 42, 49]
>>> to_remove = set(my_list[0::2])  # {1, 14, 28, 42}
>>> [x for x in index if x not in to_remove]
[8, 21, 35, 49]

在您的情况下,您将使用to_remove = set(my_list[0::56])。这里0是起始索引(默认是0),56是元素之间的间隔(默认是1)。

相反,如果您想保留那些不在index 中的第 56 个元素(如您的代码所示),您可以使用这个:

>>> index_set = set(index)
>>> [x for x in my_list[0::56] if x not in index_set]

好的,我想现在我得到了你想要的:

>>> index = [1, 3]
>>> my_list = list(range(20))
>>> [x for n in range(0, len(my_list), 5) 
       for i, x in enumerate(my_list[n:n+5]) if i not in index]
[0, 2, 4, 5, 7, 9, 10, 12, 14, 15, 17, 19]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 2019-08-02
    • 2015-01-05
    • 2012-05-09
    相关资源
    最近更新 更多