当前位置: 首页 > 知识库问答 >
问题:

在if语句中使用For循环

晋涛
2023-03-14

我有一个380行20列的表格。我想从该表中删除符合特定条件的行。

为了澄清问题,假设我有以下列表:

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

我想删除在列表名称中找到姓名的所有人员的数据。

例如,假设我的数据如下所示:

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文件时,我可以看到数据没有被删除。

我可以肯定错误在< code > if data[row][0]= =(I for I in names):我该如何修复这个问题?

共有3个答案

段干宾白
2023-03-14
if data[row][0] == (i for i in names):
            print 'removing the data of', i, '...'

在该部分中,i(i for i in name)中用作本地可验证。但在下一个打印行中,您使用i。在这里您不能使用这个。

您可以使用检查,就好像名称中的数据[行][0]一样:您可以尝试如下操作:

if data[row][0] ==  names:
            print 'removing the data of', data[row][0], '...'
齐成和
2023-03-14

您正在检查数据[row][0]是否与(i表示名称中的i)。您要做的是检查它是否与<code>(名称中的i表示i)

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

您也可以使用运算符中的<code>以非荒谬的方式执行

data[row][0] in names

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

娄学文
2023-03-14

条件应写为:

if data[row][0] in names:

在您当前的代码中,<code>(i代表名称中的i)

>>> (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
>>>

如注释中所述,通过在迭代行之前将名称转换为集合,可以使此检查更加高效。但理想情况下,您将使用熊猫库来操作csv /表数据。有关类似示例,请参阅此答案。您可以使用 df[~df.名称.

 类似资料:
  • 问题内容: 目前无法打破此循环。如果要在此列表中找不到变量,我想破坏它,以便它可以移动另外两个循环。它期望在循环的顶部有一个缩进的块,但是如果更改循环的开头或开头的位置,它将无法正常工作。救命! 问题答案: 正如人们在对您的问题的评论中提到的那样,您需要分别打破每个循环,仅停止其所在的循环 两个 循环都需要这样做 如果您也想打破while循环,那么您也可以添加该循环。

  • 问题内容: 可以说我必须在for循环内使用if语句,并且for循环在特定条件下触发,而if语句仅在for循环达到特定阶段时才触发。 例如,条件是一个计数器,该计数器在发生某些事情(例如,球从屏幕上掉下来)时进行计数。每次球越过屏幕时,都会一圈绘制一个圆圈。当第一行中的圆圈到达屏幕的末端时,圆圈开始出现在第一行下方的第二行中。但是第二行对我不起作用,我已经用if语句实现了。 if语句仅在第一行的球越

  • 有人能帮我找出为什么Instachat:Stick\u out\u舌头\u winking\u eye:'和'Docs To Go'的代码没有返回False吗™ 免费办公套房'?它们包含Unicode大于127的字符(分别为emoji和TM),因此从技术上讲,这两个字符都应该返回False。 我不明白为什么else条款在这里不起作用。 下面应该是我的代码的预期输出:True False 然而,实际

  • 这个程序基本上允许用户输入任何单词,直到他/她输入单词“last”。 如果单词包含字母“s”,则应显示单词确实包含“s”或“s”,否则应显示单词不包含“s”或“s”。 示例:用户输入的单词= •约翰 詹姆斯 •馅饼 莎莉 结果: 约翰不包含's'或'S' James确实包含“s”或“s” 馅饼不含's'或'S' Sally不包含“s”或“s” 该程序可以工作,但我需要更改if语句,以便它使用equ

  • 问题内容: 因此,我正在为不和谐而开发一个聊天机器人,现在正在开发一个可以用作待办事项列表的功能。我有一个命令可以将任务添加到列表中,并将它们存储在字典中。但是,我的问题是以更易读的格式返回列表(参见图片)。 任务存储在一个称为中。但是,为了使bot实际发送消息,我需要使用一条语句,否则它将仅将其打印到控制台而不是实际的聊天记录(参见图片)。 这是我尝试解决的方法,但是由于我使用了for循环,因此

  • 着色器语言GLSL中关于if语句、for语句的使用,和javascript语言、C语言中的if语句、for语句执行逻辑规则基本一致,这里默认你已经有一定的编程基础,也就不做过多讲解,只是简单说明一下。 单独使用if if(x>100){ gl_FragColor = vec4(1.0,0.0,0.0,1.0);//红色 } if-else形式 bool colorBool; // 根据布尔值