通过索引从另一个整数列表中删除列表中的元素

时间:2018-05-04 17:29:44

标签: python list

所以我有两个清单:

num = [
    3, 22, 23, 25, 28, 29, 56, 57, 67, 68, 73, 78, 79, 82, 83, 89, 90, 91,
    92, 98, 99, 108, 126, 127, 128, 131, 132, 133
]
details = [
    'num=10,time=088', 'num=10,time=084', 'num=10,time=080', 'num=10,time=076',
    'num=10,time=072', 'num=10,time=068', 'num=10,time=064', 'num=10,time=060',
    'num=10,time=056', 'num=10,time=052', 'num=10,time=048', 'num=10,time=044',
    .
    .
    .
    .
    'num=07,time=280', 'num=07,time=276', 'num=05,time=508', 'num=05,time=504',
    'num=05,time=500', 'num=05,time=496'
]

num有28个元素,details有134个元素。我想根据details中的值,按索引删除num中的元素。例如,索引为3,22,23,25,28 ......的元素(这些是num列表中的数字)应从details中删除。

当我按照here所述使用.pop()时,它会给我一个错误说:

AttributeError: 'str' object has no attribute 'pop'

类似地,当我使用del details[]时,它给出了一个错误说:

IndexError: list assignment index out of range

这是我的代码:

for an in details:
    an.pop(num)

2 个答案:

答案 0 :(得分:3)

这应该做你想要的(从num中删除每个元素索引的每个元素的详细信息):

for i in reversed(num):
    del details[i]

它向后迭代列表,以便删除未来事物的索引不会改变(否则你删除3然后将以前索引为22的元素为21) - 这可能是IndexError的来源。

答案 1 :(得分:0)

嗯。两件事情。首先你的循环不太正确。而不是

for an in details:
an.pop(num)

你想要

for an in num:         # step through every item in num list
    details.pop(an)    # remove the item with index an from details list

其次,您需要确保以相反的顺序从详细信息中弹出()项目,以便您的索引良好。例如,如果您从详细信息中弹出()索引3,则详细信息中的所有其他内容都会重新排序,当您去除索引22时,它将是错误的"单元格"。

我已将简化的细节简化为包含数字0到133的列表,但此代码在您的真实列表中应该可以正常工作

num = [3, 22, 23, 25, 28, 29, 56, 57, 67, 68, 73, 78, 79, 82, 83, 89, 90, 91, 92, 98,
99, 108, 126, 127, 128, 131, 132, 133]

details = list(range(134))


# sort indexes in descending order (sort in place)
num.sort(reverse = True)

for an in num:
    details.pop(an)

print(details)

输出

[0, 1, 2, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 24,
26, 27, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55, 58, 59, 60, 61, 62, 63, 64, 65, 66, 69, 70, 71,
72, 74, 75, 76, 77, 80, 81, 84, 85, 86, 87, 88, 93, 94, 95, 96, 97, 100, 101, 10
2, 103, 104, 105, 106, 107, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 11
9, 120, 121, 122, 123, 124, 125, 129, 130]