在Python中删除/替换元组中的错误

0 投票
5 回答
1275 浏览
提问于 2025-04-16 12:41

我有一串元组的字符串

LL =  [ ("text1",2,3,N/A), ("text2",N/A,5,6),("text3",N/A,5,N/A) ]

我需要

LL =  [ ("text1",2,3,-1), ("text2",-1,5,6), ("text2",-1,5,-1) ]

所以我想简单地把N/A去掉,换成-1。我需要读取所有行吗?数据下载显示N/A,这不是一个变量。

LL是字符串

使用 ("text2",N/A,5,6)

在运行python时,查看 [0] 的类型是'str'。

查看 [1] 的类型时,我没有得到任何输出。

如果我把上面的行分成a, b, c, d,既然我想要的是数字而不是N/A,有没有办法在分割每一行的时候说如果不是数字就换成一个数字(-1)?或者,如果出错就换成-1。

这里还有一个链接,里面有同样的问题,注意[1]有一个N/A。 http://download.finance.yahoo.com/d/quotes.csv?s=GS&f=sb6vt1&e=.csv

在处理数据下载时,CSV字段很麻烦。我该如何使用try/Except格式。

try: 
   IF XXX or YYY or ZZZ or AAA == 'N/A',
   (dont process data...skip to except and pass)
except:
   pass 

5 个回答

1

这个列表推导式会遍历LL中的每一个项目,把字符串"N/A"替换成-1

LL = [ ("text1",2,3,"N/A"), ("text2","N/A",5,6),("text3","N/A",5,"N/A") ]
LL = [tuple(x if x != "N/A" else -1 for x in i) for i in LL]
print LL
# [('text1', 2, 3, -1), ('text2', -1, 5, 6), ('text3', -1, 5, -1)]

如果N/A不是一个字符串,那么你的代码看起来就不太像有效的Python代码,请修改你的帖子,我会尽量调整我的回答。

不幸的是,如果你不知道的条目会在哪里,就没有办法不遍历所有数据就替换掉它们。

编辑:如果LL是一个字符串,那么正如其他人所说,replace应该能满足你的需求,这里有一个完整的例子:

LL = '[ ("text1",2,3,N/A), ("text2",N/A,5,6),("text3",N/A,5,N/A) ]'
LL = LL.replace("N/A", "-1")
print LL
# [ ("text1",2,3,-1), ("text2",-1,5,6),("text3",-1,5,-1) ]
1

根据其他回答的评论,我觉得我明白发生了什么:

LL 是一个字符串,它表示一个元组的列表,类似于这样:

LL = '[ ("text1",2,3,N/A), ("text2",N/A,5,6),("text3",N/A,5,N/A) ]'

这会生成用户428862从另一个系统得到的那种字符串。我们可以用这段代码来替换掉 "N/A" 的值,并把字符串转换成一个可以使用的列表:

import ast
LL_replaced = LL.replace('N/A', '-1')
LL_as_list = ast.literal_eval(LL_replaced)

现在 LL_as_list 是一个元组的列表,原始字符串中 "N/A" 的地方都变成了 -1。这样做是你想要的吗?

1

你下载的源文件是一个csv文件,不是什么奇怪的python类型。你可以直接使用CSV模块来处理CSV文件,这样会更简单方便,而不是用你自己拼凑的解决方案。

import csv, urllib
rawStockInfo = csv.reader(urllib.urlopen('http://download.finance.yahoo.com/d/quotes.csv?s=GS+AAPL+MSFT+AMZN&f=sb6vt1&e=.csv'))
stocks = [] #list for our cleaned up version
for stock in rawStockInfo:
    print stock
    #this replaces the string "N/A" with the int -1
    stockClean = [-1 if x == 'N/A' else x for x in stock]
    stocks.append(stockClean)
print stocks

注意,你可能想把那个列表表达式改成对stock中单元格的另一个循环……这样可以尝试把任何字符串转换成整数,同时把'N/A'替换成-1。

stockClean = []
for cell in stock:
    try:
        stockClean.append(int(cell)) #turn the string '4' into the integer 4
    except ValueError:
        if cell == 'N/A':
            stockClean.append(-1)
        else:
            stockClean.append(cell)

撰写回答