Python 将列表中的某些对象转换为int

Python 将列表中的某些对象转换为int,python,arrays,arraylist,type-conversion,Python,Arrays,Arraylist,Type Conversion,因此,我正在读取一个csv文件,在csv文件中输入一个API,然后使用Python将响应打印到另一个文件中 现在,我的csv文件由12个请求参数组成,其中9个作为整数传递,3个作为字符串传递,同时点击API 我不能把它们转换成整数。 我的代码正常运行时间如下(目前跳过了API部分): 我的输出是: ['\ufeff87068', '4', '-1', '0', '0.916999995708465', '0.9608271718025208', 'ANDROID', '33', 'aa27f68

因此,我正在读取一个csv文件,在csv文件中输入一个API,然后使用Python将响应打印到另一个文件中

现在,我的csv文件由12个请求参数组成,其中9个作为整数传递,3个作为字符串传递,同时点击API

我不能把它们转换成整数。 我的代码正常运行时间如下(目前跳过了API部分):

我的输出是:

['\ufeff87068', '4', '-1', '0', '0.916999995708465', '0.9608271718025208', 'ANDROID', '33', 'aa27f680-2ddb-4d61-b685-e29a15f9c85b', '1', '1', '498\n']
['87068', '4', '-1', '0', '0.916999995708465', '0.9608271718025208', 'ANDROID', '33', 'aa27f680-2ddb-4d61-b685-e29a15f9c85b', '0', '1', '498\n']
Q.1如何将此数组的某些元素转换为整数

Q.2如何删除第一行第一个元素中的“\ufeff”

Q.3如何在数组的最后一个元素中删除\n?我正在为最后一个元素使用replace函数

我的输出是:

['\ufeff87068', '4', '-1', '0', '0.916999995708465', '0.9608271718025208', 'ANDROID', '33', 'aa27f680-2ddb-4d61-b685-e29a15f9c85b', '1', '1', '498\n']
['87068', '4', '-1', '0', '0.916999995708465', '0.9608271718025208', 'ANDROID', '33', 'aa27f680-2ddb-4d61-b685-e29a15f9c85b', '0', '1', '498\n']
您打印的是
,而不是
d
,因此您可以在不替换的情况下看到东西。;)
您的
.replace('\n','')
是正确的


第二季度/第三季度。对您可以执行
.replace
.strip
。不带参数的Strip将删除字符串开头和结尾的所有空白,包括
\n

如果将简单拆分替换为以下内容:

line = [elem.strip().replace('\ufeff', '') for elem in line.split(',')]
确保元素的开头和结尾都没有空格,并且元素都没有此unicode字符


问题1。它是
int(str\u value\u to\u convert)
(所以
int(第[0]行)
等等)

但是,为了不在其中放入太多的
int()
,您可以使用以下行:

line = [int(elem) if elem.isdigit() or (elem[0] == '-' and elem[1:].isdigit()) else elem for elem in line]
.isdigit()
检查字符串中的所有字符是否都是数字。对于负整数不起作用(因为
-
不是数字),因此我使用了
检查第一个字符是否为负数,以及字符串的其余部分是否仅为数字


另一个有用的更改是如何创建字典。因为您按顺序使用
中的元素,所以我们可以使用标签列表压缩它,并使用显式
dict
构造函数:

for cnt, line in enumerate(fp):
    line = [elem.strip().replace('\ufeff', '') for elem in line.split(',')]
    line = [int(elem) if elem.isdigit() or (elem[0] == '-' and elem[1:].isdigit()) else elem for elem in line]
    d = dict(zip(["customer_id","listing_slot","closingIn","new_user","last_mile_distance","stress","customer_user_agent","listing_restaurant_sla","request_id","ld","city_id","restaurant_id"], line)) 
虽然您可以检查子字符串
中的每个字符是否都是数字
,或者只是
尝试
转换为
int
,但我建议不要这样做。如果出于某种原因应该保留为字符串的段也只包含数字怎么办?另外,请注意,您还有一些部分可能需要转换为
浮点
。 相反,我建议使用一个类型列表来确定每个部分应该如何转换,然后
zip
ing这两个部分并进行实际转换

>>> line = '\ufeff87068,4,-1,0,0.916999995708465,0.9608271718025208,ANDROID,33,aa27f680-2ddb-4d61-b685-e29a15f9c85b,1,1,498\n'
>>> items_raw = line.strip().lstrip('\ufeff').split(",")
>>> types = [int, int, int, int, float, float, str, int, str, int, int, int]
>>> items = [t(x) for t, x in zip(types, items_raw)]    
>>> items
[87068, 4, -1, 0,
 0.916999995708465, 0.9608271718025208,
 'ANDROID',
 33,
 'aa27f680-2ddb-4d61-b685-e29a15f9c85b',
 1, 1, 498]
您还可以在列表上使用乘法,使
类型
列表稍微短一些,并且可能更可读,特别是当列表中有更多的条目时:

types = [int] * 4 + [float] * 2 + [str, int, str] + [int] * 3
类似地,您可以为字段的名称创建另一个列表,并
zip
使用字典中的项目对其进行编辑:

>>> fields = ["customer_id","listing_slot","closingIn","new_user","last_mile_distance","stress","customer_user_agent","listing_restaurant_sla","request_id","ld","city_id","restaurant_id"]
>>> d = {f: x for f, x in zip(fields, items)}
>>> d = {f: t(x) for f, t, x in zip(fields, types, items_raw)}
或者将其与单个词典中的类型转换结合使用:

>>> fields = ["customer_id","listing_slot","closingIn","new_user","last_mile_distance","stress","customer_user_agent","listing_restaurant_sla","request_id","ld","city_id","restaurant_id"]
>>> d = {f: x for f, x in zip(fields, items)}
>>> d = {f: t(x) for f, t, x in zip(fields, types, items_raw)}
无论哪种方式,
d
最终都是

{'city_id': 1,
 'closingIn': -1,
 'customer_id': 87068,
 'customer_user_agent': 'ANDROID',
 'last_mile_distance': 0.916999995708465,
 'ld': 1,
 'listing_restaurant_sla': 33,
 'listing_slot': 4,
 'new_user': 0,
 'request_id': 'aa27f680-2ddb-4d61-b685-e29a15f9c85b',
 'restaurant_id': 498,
 'stress': 0.9608271718025208}

Q1,
int(str\u value\u to\u convert)
.Q2/Q3.
.replace
.strip
。不带参数的strip将删除字符串开头和结尾的所有空白,包括
\n
还包括:打印
,而不是
d
,因此您可以看到不需要替换的内容。
.replace('\n','')
是正确的。
\ufeff
表示BOM-嘿,谢谢你的回复。我还想添加请求参数的名称,以便在API调用中传递它们。我无法理解在哪里可以添加它们。在我的原始代码中,我添加了d={“customer_id”:行[0],……目前我的输出是:[87068,4,-1,0,0.9169995708465,0.96082718025208,'ANDROID',33,'aa27f680-2ddb-4d61-b685-e29a15f9c85b','1',1498]{“errorCode”:“Exception”,“errorBody”:{},“status”:0}但是,我希望请求类似于{“rdc\u name”:87068,“listing\u slot”:4,“关闭”:-1。。。。。。。