Python将列表中的字符串转换为数字
Posted
技术标签:
【中文标题】Python将列表中的字符串转换为数字【英文标题】:Python converting strings in a list to numbers 【发布时间】:2018-03-23 13:19:12 【问题描述】:我遇到了以下错误信息:
以 10 为底的 int() 的无效文字:'"2"'
2 在外面用单引号括起来,在里面用双引号括起来。此数据位于使用print primes[0]
的primes
列表中。
primes
列表中的样本数据:
["2","3","5","7"]
primes
列表是通过以下方式从 CSV 文件创建的:
primes=csvfile.read().replace('\n',' ').split(',')
我正在尝试将primes
列表中的字符串转换为整数。
通过 Google,我在 SE 上遇到了与我类似的问题,并且我尝试了与我的问题 IMO 相关的两个常见答案。
使用 map():
primes=map(int,primes)
使用列表推导:
primes=[int(i) for i in primes]
不幸的是,当我使用它们中的任何一个时,它们都会给出与上面列出的相同的错误消息。当使用 long() 而不是 int() 时,我会收到类似的错误消息。
请指教。
【问题讨论】:
你的 csv 在引号中有一堆素数?问题是引号。只需删除引号即可。 使用csv
模块,引号将被删除,您将能够转换数字
你能给我们一些关于输入是什么样子的想法吗?比如primes=csvfile.read().replace('\n',' '); print(primes[:160])
的输出是什么?
你能展示你输入的样本吗?
抱歉,您应该在此处提供示例数据 -1。我不知道你是如何获得赞成票的。
【参考方案1】:
你想要的:
读取每个 csv 行 使用所有行的扁平版本创建一个整数列表。所以你必须处理引号(有时它们甚至可能不在这里,具体取决于文件的创建方式),而且当你用空格替换换行符时,这不会将最后一个数字从一行中拆分为下一行的第一个数字。你有很多问题。
改用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(',')]
),但更复杂且容易出错。
【讨论】:
我了解您的代码会导入文件中的所有素数。我将如何限制导入的元素数量?我在素数文件中有数百万个素数 - 我如何将导入的元素数量限制为例如 200,000? 不错。并为 python2 使用xrange
而不是range
?
@unseen_rider 是的,在这种情况下会节省一些内存。因为这是标记为 python 2.7 我会添加它。
运行此代码后我得到了StopIteration
异常。
当然,如果您的文件太小。查看我的编辑,我已将默认参数添加到 next
,如果您的文件太小,您现在将得到零。【参考方案2】:
你可以试试这个:
primes=csvfile.read().replace('\n',' ').split(',')
final_primes = [int(i[1:-1]) for i in primes]
【讨论】:
我认为这行不通,因为它根据逗号分割,所以下一行的最后一个数字和第一个数字不会被分割 否决,因为这个答案是“试试这个:code”。如果您对解释得更好的内容进行编辑,我将删除反对票。 @Jean-FrançoisFabre 您的解决方案无疑是最强大的;但是,由于 OP 没有发布他的文件样本,我无法确定。 @Jean-FrançoisFabre 同样,我给了你一个赞成票,因为从 OP 问题的当前状态来看,这似乎是他所需要的。如果它实际上解释了意图是什么,我会删除对这个答案的反对意见(但我只会在它看起来正确的情况下投赞成票)。【参考方案3】:试试这个:
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)
【讨论】:
试试这个并得到“TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'” @Jean-FrançoisFabre 你能告诉我你的数据输入吗? 不需要:i
是 list
,因为 data
是 csv.reader
。你测试过这个吗?
但问题从未说明 csv 的格式,是 rows 还是 colls 或两者兼而有之
由于OP是按逗号分割的,我猜应该不止1列。以上是关于Python将列表中的字符串转换为数字的主要内容,如果未能解决你的问题,请参考以下文章