在If语句中使用For循环

2024-04-26 10:51:41 发布

您现在位置:Python中文网/ 问答频道 /正文

问题

我有一个由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]])

我的代码正在工作,但是数据没有从原始数据中删除。当我打开新的测试.txt文件,我可以看到数据没有被删除。你知道吗

我确信这个bug在if data[row][0] == (i for i in names): 我怎样才能解决这个问题?你知道吗


Tags: 数据intxtfordatanamesjohnrobert
3条回答
if data[row][0] == (i for i in names):
            print 'removing the data of', i, '...'

在这一部分中,i(i for i in names)中用作本地验证。但在下一个打印行中使用i。这里你不能用这个。你知道吗

您可以使用for check作为if data[row][0] in names:。您可以尝试以下方式:

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

条件应写为:

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/表数据。类似的例子见this answer。你可以用df[~df.Name.isin(...)]来否定这个条件。你知道吗

您正在检查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]相同。你知道吗

相关问题 更多 >