2012-10-16 38 views
0

我有一个文件我放入一个列表,我想从中取出一些东西,并追加到另一个列表(我没有问题),我遇到的问题是删除第一个列表中的东西。下面是我已经尝试过的,但它只是从原始列表中删除所有其他人。Python的列表中删除附加

list: 
bob  g1 3110 
bob  g2 244 
bob  g3 -433 
greg fun112 10595 
greg fun113 -1203 
greg fun114 -3049.999 
greg fun115 3808 
greg fun116 320 
greg got112 -600 
greg got113 5958 
greg got114 1249 


file1 = open('test','rb').read().splitlines() 
file1=sorted(file1) 
test_group = ['fun','got'] 
test= [] 

for product in file1: 
    spt = product.split(",") 
    for line in spt: 
     if line[:3] in test_group: 
      x = test.append(product) 
      y = file1.remove(product) 

测试[]列表是好的所有我想在那里的项目去,没有问题,但是当我回顾文件1只拿出的“乐趣”和“有”线

每隔一个

为什么这只能拿出所有其他的,我该如何解决?

回答

8

不要试图修改你正在迭代的列表!这不行!

如果使列表的副本,那么它应该工作:

for product in file1[:]: 
    spt = product.split(",") 
    for line in spt: 
     if line[:3] in test_group: 
      x = test.append(product) 
      y = file1.remove(product) 
+4

'追加()'和'remove()方法返回''None',所以存储其值'x'&'y'没有按”没有任何意义。 –

+0

工作很好,请你解释是什么导致了错误,试图从我的许多错误中学习:) –

+0

考虑[这个例子](http://pastebin.com/TsKv1YwC) - 在这里迭代列表中的每个项目看到的是打印然后删除。这意味着,现在列表中的下一个项目将以它的速度进行,并且随着索引计数器递增,它将在下一次迭代中跳过(尝试找出列表中的剩余内容:))。这可能会导致非常讨厌和难以找到错误,所以最好不要这样做(它也在[官方的Python教程]中说过)(http://docs.python.org/tutorial/controlflow.html#for-语句) – mata

0

这可能是因为负整数,它可能会阅读那些跳过?你有没有测试过?

2

你不想被操纵您当前迭代(一个对象,如果你尝试这种用字典实例,你会得到一个异常)。

此外,由于list.appendlist.remove就地,它总是返回None - 所以没有必要将结果分配给任何东西。

我会做类似如下:

with open('test') as fin: 
    test = [] 
    other = [] 
    rows = (line.split() for line in fin) 
    for name, group, value in rows: 
     if group[:3] in ('fun', 'got'): 
      add = test.append 
     else: 
      add = other.append 
     add([name, group, value])