繁体   English   中英

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

[英]Python converting strings in a list to numbers

我遇到了以下错误消息:

int()的基数为10的文字无效:'“2”'

2在外面用单引号括起来,在里面用双引号括起来。 此数据位于使用print primes[0]primes列表中。

primes列表中的样本数据:

["2","3","5","7"]

primes列表是通过以下CSV文件从CSV文件创建的:

primes=csvfile.read().replace('\n',' ').split(',')

我试图尝试将primes列表中的字符串转换为整数。

通过谷歌,我在SE上遇到了类似的问题,我尝试了两个与我的问题IMO相关的常见答案。

使用map():

primes=map(int,primes)

使用列表理解:

primes=[int(i) for i in primes]

不幸的是,当我使用它们中的任何一个时,这些都会给出与上面列出的相同的错 当使用而不是int()时,我得到long()的类似错误消息。

请指教。

你要:

  • 阅读每个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(',')] )但更复杂且容易出错。

你可以试试这个:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM