如果str==“value”在str为“value”时计算为False

2024-10-05 17:38:02 发布

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

我有一张从网上刮下来的股票行情表,我正试图从中删除“n/a”值

以下是尝试删除值之前列表的一个片段:

 ticker_list = ['BANR',
 'AUB',
 'HOPE',
 'INDB',
 'CVBF',
 'FFBC',
 'FRME',
 'TRMK',
 'n/a',
 'n/a']

下面是我尝试运行以删除这些值的内容:

for x in ticker_list:
    if x == 'n/a':
        ticker_list.remove(x)

此代码部分有效。它会删除其中一个n/a值,从而导致:

['BANR', 'AUB', 'HOPE', 'INDB', 'CVBF', 'FFBC', 'FRME', 'TRMK', 'n/a']

我还尝试了以下方法:

for x in ticker_list:
    if x.strip() == 'n/a':
        ticker_list.remove(x)

还包括:

for x in ticker_list:
    if 'n/a' in x.strip():
        ticker_list.remove(x)

在所有情况下,我得到的结果都是一样的。它仅删除一个n/a值,但仍保留一个

这是某种编码的事情,还是我在做一些愚蠢的事情

非常感谢您的回复


Tags: inforifremovelisttickerstripindb
1条回答
网友
1楼 · 发布于 2024-10-05 17:38:02

问题是:在迭代时删除元素,这是一种“未定义的行为”

您可以通过列表压缩实现同样的效果:

ticker_list = [value for value in ticker_list if value != "n/a"]

这是因为它没有与序列一致的操作,因为它的支持迭代器可能会尝试移动到下一个值,并且它可能不再存在。例如:

  • list删除将忽略最后一个元素:
def remove(values):
    for value in values:
        if value == 1:
            values.remove(value)

print(remove([1, 1, 2, 3, 4, 5, 1])) # [2, 3, 4, 5, 1]
  • set删除将引发运行时错误:在迭代过程中设置更改的大小
def remove(values):
    for value in values:
        if value == 1:
            values.remove(value)

print(remove({1, 1, 2, 3, 4, 5})) # Won't work
  • dict中删除将引发运行时错误:字典在迭代过程中更改了大小
def remove(values):
    for key, value in values.items():
        if key == 1:
            del values[k]

print(remove({1: 'a', 1: 'b', 2: 'c', 3: 'd', 4: 'e', 5: 'f'})) # Won't work
  • collections.deque中删除将引发运行时错误:在迭代过程中deque发生了变化
def remove(values):
    for value in values:
        if value == 1:
            values.remove(value)

print(remove(collections.deque([1, 1, 2, 3, 4, 5]))) # Won't work

从所有这些中,只有list默默地失败Python docs还注意到,在迭代列表时更改列表是不安全的:

It is sometimes tempting to change a list while you are looping over it; however, it is often simpler and safer to create a new list instead.

相关问题 更多 >