从python中的元组中删除/替换错误

时间:2011-02-28 18:22:52

标签: python tuples

我有一串元组

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) ]

所以简单地用-1替换N / A替换。我需要阅读所有行吗? 数据下载显示N / A,它不是变量。

LL是字符串

使用("text2",N/A,5,6)。 在[0]上运行python类型是'str'。 在[1]上运行python类型,我没有输出。

如果我将上面的行拆分为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 个答案:

答案 0 :(得分: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,编辑您的帖子,我会尝试相应地修改我的答案。

不幸的是,如果您不知道N/A条目的位置,则无法在不循环遍历所有数据的情况下替换它们。

修改:如果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 :(得分: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。这是你追求的吗?

答案 2 :(得分:1)

你要下载的源代码是一个csv文件,而不是一些奇怪的python东西。您可以使用CSV module更直接,更轻松地处理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中单元格的另一个循环...这会尝试将任何字符串转换为整数,并将-1替换为“N / A”。

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)

答案 3 :(得分:0)

也许我不太了解您的问题,但如果按照您的说法下载数据,则可以指定

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

到一个字符串:

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

现在,s.replace("N/A", "-1")应该可以解决问题。

答案 4 :(得分:0)

试试这段代码:

NEW = [tuple(x if isinstance(x, (basestring, int, long, float)) else -1 for x in i) for i in LL]

它替换所有未知类型的元素。