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 你能告诉我你的数据输入吗? 不需要:ilist,因为 datacsv.reader。你测试过这个吗? 但问题从未说明 csv 的格式,是 rows 还是 colls 或两者兼而有之 由于OP是按逗号分割的,我猜应该不止1列。

以上是关于Python将列表中的字符串转换为数字的主要内容,如果未能解决你的问题,请参考以下文章

将字符串列表转换为数字列表 Python

Python 怎么将列表类字典组字符串转换为列表?

在python中,如何将一个字符串中的小写字母全部转换为大写?

python把一个数字列表转化为一个数字

在 R 中使用混合类型将嵌套列表中的字符数字转换为数字

如何将字符串数字转换为列表中的整数?