2016-04-21 95 views
1

我必须删除行列表中项目的索引,其中lines[0]的项目不在标题中。Python:按索引弹出列表列表中的项目

输入如下:

headers = ['internal_id', 'default_code', 'ean13', 'supplier_id', 'product_qty'] 
lines = [['default_code', 'fld_code', 'test'],[1212, 4545, 'test1'],[45, 787, 'test2']] 

预期输出如下:

lines = [['default_code'],[1212],[45]] 

我已经试过到目前为止做的是在这里:

for x in lines[0]: 
    if x not in headers: 
     for line in lines[0]: 
      line.pop(line.index(x)) 
print lines 

这尚未产生所需的产出。请帮助。

+0

既然你改正了语言凯文Cruijssen,我不明白...对我来说“预期的输出”是不兼容的解释“我必须删除行列表中的项目由行项目索引[0]不在标题中“ – Vince

回答

1

我校根据您的代码:

for i, x in reversed(list(enumerate(lines[0]))): 
    if x not in headers: 
     for line in lines: 
      line.pop(i) 
print lines 

输出:

[['default_code'], [1212], [45]] 
+0

乔,我编辑了我的答案。它会循环线[0]并反转并处理超过2个元素。但是,如果问题标记为已回答,则不应对其进行编辑。 – qvpham

+0

感谢它正在工作....! – Jothimani

0

使用列表理解(您也可以使用filter)。

lines = [line for line in lines if line[0] in headers] 

输出:

[['default_code', 'fld_code']] 

如果你想要的是一个 “手动” 循环使用list.remove

for x in lines: 
    if x[0] not in headers: 
     lines.remove(x) 
+0

@我需要删除线条[0]中的缺失项目以及标题中的所有列表,以及线条[0]的缺失项目索引的相同索引中的所有列表。 – Jothimani

0

,如果你想使用弹出,你必须使用索引,然后没有问题的话,最好从头开始。

for x in range(len(lines)-1,-1,-1): 
    if lines[x][0] not in headers: 
     lines.pop(x)  
print lines 

我不知道你的项目是什么,但你应该考虑使用一个词典。

0

这是你想写:)

for x in lines[0]: 
    if x not in headers: 
     n = lines[0].index(x) 
     for line in lines: 
      line.remove(line[n]) 
print lines 

你是那种亲密的代码。如果你想在某个位置“删除”一个元素,你不想使用pop。有更优雅和更短的解决方案,但这个适合你的编码风格。看看Python中的列表理解,它非常强大。

0
for line in lines[0]: 
     line.pop(line.index(x)) 

我希望在循环线是持有的字符串类型的值。我们不能在字符串中使用pop。纠正我,如果我错了。