在If语句中使用For循环

时间:2015-04-18 20:17:27

标签: python if-statement for-loop

问题

我有一个由380行和20列组成的表。我希望在某个条件下删除此表中的行。

为澄清事情,我们说我有清单:

names = ['John', 'Amy', 'Daniel']

我想删除名单在names列表中找到的所有人的数据。

示例,让我们说我的数据看起来像这样:

John    82    3.12    boy
Katy    12    1.12    girl
Amy     42    2.45    girl
Robert  32    1.56    boy
Daniel  47    2.10    boy

我想删除JohnAmyDaniel的数据。所以输出应该是:

Katy    12    1.12    girl
Robert  32    1.56    boy

尝试解决它

import csv
import numpy as np

# loading data
data = np.genfromtxt('file.txt', dtype = None)

csvfile = "home/paula/Desktop/test.txt"
with open(csvfile, 'w') as output:
    writer = csv.writer(output, delimiter = '\t')

    for row in range(len(data)):
        if data[row][0] == (i for i in names):
            print 'removing the data of', i, '...'
        else:
            writer.writerow([data[row][0], data[row][1], 
                             data[row][2], data[row][3]])

我的代码正在运行,但数据未从原始数据中删除。当我打开新的test.txt文件时,我可以看到数据没有被删除。

我确定错误发生在if data[row][0] == (i for i in names): 我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

应该写下这个条件:

if data[row][0] in names:

在您当前的代码中,(i for i in names)创建一个生成器,然后您正在测试该字符串是否等于生成器对象,这将是false

>>> (i for i in names)
<generator object <genexpr> at 0x1060564b0>
>>> 'John' == (i for i in names)
False
>>>

相反,您可以测试项目是否在列表中,如下所示

>>> names = ['John', 'Amy', 'Daniel']
>>> 'John' in names
True
>>> 'Bob' in names
False
>>>

正如评论中所述,您可以在迭代行之前将names转换为set,从而提高效率。但理想情况下,您可以使用Pandas库来操作csv / table数据。有关类似示例,请参阅this answer。您可以使用df[~df.Name.isin(...)]否定条件。

答案 1 :(得分:0)

您正在检查data[row][0]是否与(i for i in names)相同。您要做的是检查它是否与(i for i in names)元素之一相同。你可以这样做:

any([data[row][0]==i for i in names])

您也可以使用in运算符以非荒谬的方式执行此操作:

data[row][0] in names

检查names的任何元素是否与data[row][0]相同。

答案 2 :(得分:0)

if data[row][0] == (i for i in names):
            print 'removing the data of', i, '...'
该部分i中的

(i for i in names)中用作本地可靠的。但在下一个打印行中,您使用i。在这里你不能使用它。

您可以使用if data[row][0] in names:作为支票。您可以尝试:

if data[row][0] ==  names:
            print 'removing the data of', data[row][0], '...'