Python将列表中的字符串转换为数字
我遇到以下错误消息: 基数为10的int()的文本无效:““2” 2在外面用单引号括起来,在里面用双引号括起来。此数据位于使用Python将列表中的字符串转换为数字,python,python-2.7,list,csv,Python,Python 2.7,List,Csv,我遇到以下错误消息: 基数为10的int()的文本无效:““2” 2在外面用单引号括起来,在里面用双引号括起来。此数据位于使用打印素数[0]的素数列表中 primes列表中的样本数据: ["2","3","5","7"] primes列表是通过以下方式从CSV文件创建的: primes=csvfile.read().replace('\n',' ').split(',') 我正在尝试将素数列表中的字符串转换为整数 通过谷歌,我在SE上遇到了与我类似的问题,我尝试了与我的问题相关的两个常见答案
打印素数[0]
的素数列表中
primes
列表中的样本数据:
["2","3","5","7"]
primes
列表是通过以下方式从CSV文件创建的:
primes=csvfile.read().replace('\n',' ').split(',')
我正在尝试将素数
列表中的字符串转换为整数
通过谷歌,我在SE上遇到了与我类似的问题,我尝试了与我的问题相关的两个常见答案
使用map():
使用列表理解:
primes=[int(i) for i in primes]
不幸的是,当我使用它们中的任何一个时,它们都会给出与上面列出的相同的错误消息。当使用long()代替int()时,我会收到类似的错误消息
请告知。您可以尝试以下方法:
primes=csvfile.read().replace('\n',' ').split(',')
final_primes = [int(i[1:-1]) for i in primes]
你想要:
- 阅读每一行
- 使用所有行的展平版本创建单个整数列表
因此,您必须处理引号(有时引号甚至可能不在此处,具体取决于文件的创建方式),并且当您用空格替换换行符时,这不会将一行的最后一个数字与下一行的第一个数字分开。你有很多问题
改用csv
模块。假设f
是打开文件的句柄,然后:
import csv
nums = [int(x) for row in csv.reader(f) for x in row]
这将解析单元格,去掉引号(如果存在),并在一行中展平+转换为整数
要限制读取的数字数量,可以创建生成器理解,而不是列表理解,并仅使用前n项:
n = 20000 # number of elements to extract
z = (int(x) for row in csv.reader(f) for x in row)
nums = [next(z) for _ in xrange(n)] # xrange => range for python 3
更好的是,为了避免StopIteration
异常,您可以使用itertools.islice
,因此如果csv数据结束,您将获得完整列表:
nums = list(itertools.islice(z,n))
(请注意,必须倒带文件才能多次调用此代码,否则将无法获得任何元素)
当然,在没有csv模块的情况下执行此任务是可能的([int(x.strip(“”))for x in csvfile.read().replace(“\n”,”,“,”).split(“,”)])
),但更复杂且更容易出错。尝试以下方法:
primes=csvfile.read().replace('\n',' ').split(',')
final_primes = [int(i[1:-1]) for i in primes]
import csv
with open('csv.csv') as csvfile:
data = csv.reader(csvfile, delimiter=',', skipinitialspace=True)
primes = [int(j) for i in data for j in i]
print primes
或者避免重复
print set(primes)
您的csv在引号中有一组素数?问题是引号。只需删除引号。使用csv
模块,引号将被剥离,您将能够转换数字。您可以告诉我们输入的内容是什么吗?例如,primes=csvfile.read()的输出是什么。替换('\n','');print(primes[:160])
?你能展示你的输入样本吗?抱歉,你应该在这里提供样本数据-1。我不知道你是如何获得这方面的投票的。我认为这不会起作用,因为它是根据逗号分割的,所以下一行的最后一个数字和第一个数字不会被分割向下投票,因为这个答案是“试试这个:{code}”“。如果你编辑一些更好的解释,我将删除否决票。@Darthfett没有否决票,因为我不喜欢在回答同一个问题时这样做,但我高度怀疑它是否有效,原因如上所述。@Jean-Françoisfare你的解决方案肯定是最有力的;但是,因为OP没有发布他的样本文件我真的说不出来。@Jean-Françoisfar Same,我给了你一个向上的投票,因为从OP的问题的当前状态来看,这似乎是他需要的。如果这个答案真的解释了意图,我会取消对这个答案的向下投票(但如果它看起来正确,我只会向上投票)。试试这个,得到“TypeError:int()参数必须是字符串、类似于对象的字节或数字,而不是“列表”"@Jean-Françoisfar你能给我看一下你的数据输入吗?没必要:i
是一个列表
,因为数据
是一个csv.reader
。你测试过这个吗?但问题从来没有说csv的格式,是行还是列,或者两者都是。既然OP是按逗号分割的,我猜有不止一列。我理解您的代码导入文件中的所有素数。我如何限制导入的元素数量?我在素数文件中有数百万个素数-我如何限制导入的元素数量,例如200000?很好。对于python2,使用xrange
而不是range
。@unseen\u-rider是的,在这种情况下会节省一些内存。因为它被标记为python 2.7我将添加它。运行此代码后,我会得到一个StopIteration
异常。当然,如果您的文件太小。请参阅我的编辑,我已将默认参数添加到next
,如果您的文件太小,您现在将得到零。