Python 将字符串安全地强制转换为元组列表中的整数

Python 将字符串安全地强制转换为元组列表中的整数,python,python-3.x,list-comprehension,Python,Python 3.x,List Comprehension,我有一个元组列表,如下所示: [('1001794', 'Us/Eastern', '2', '1', '3', '4', '5') ('1001832', 'Us/Central', '2', '3', '4', '4', '5') ('1001848', 'Us/Central', '2', '4', '5', '4', '5') ('1001855', 'Us/Central', '2', '1', '4', '4', '5') ('1001899', 'Us/Central', '2',

我有一个元组列表,如下所示:

[('1001794', 'Us/Eastern', '2', '1', '3', '4', '5')
('1001832', 'Us/Central', '2', '3', '4', '4', '5')
('1001848', 'Us/Central', '2', '4', '5', '4', '5')
('1001855', 'Us/Central', '2', '1', '4', '4', '5')
('1001899', 'Us/Central', '2', '1', '4', '3', '5')
('1001914', 'Us/Pacific', '1', '4', '2', '4', '5')
('1001971', 'Us/Pacific', '3', '4', '2', '3', '5')
('1002021', 'Us/Eastern', '2', '1', '4', '4', '5')
('1002026', 'Us/Central', '2', '1', '4', '4', '2')
('1002028', 'Us/Eastern', '2', '1', '4', '4', '5')
('1002041', 'Us/Eastern', '2', '4', '3', '5', '4')]
我需要把里面的所有数字都转换成数字。如果必要的话,我不介意做6种不同的列表理解,但我仍然不能完全理解列表,不能从头开始。我试着做:

[x = (int(x[0]),x[1],int(x[2]),int(x[3]),int(x[4]),int(x[5]),int(x[6])) for x in tlist]
但它告诉我这是无效的语法,我不知道为什么?

这对我很有用:

y = [('1001794', 'Us/Eastern', '2', '1', '3', '4', '5'),
     ('1002041', 'Us/Eastern', '2', '4', '3', '5', '4')]
x = [(int(x[0]),x[1],int(x[2]),int(x[3]),int(x[4]),int(x[5]),int(x[6])) for x in y]
print(x)
[(1001794, 'Us/Eastern', 2, 1, 3, 4, 5), (1002041, 'Us/Eastern', 2, 4, 3, 5, 4)]
您只需要
x=
[

之外,这对我很有用:

y = [('1001794', 'Us/Eastern', '2', '1', '3', '4', '5'),
     ('1002041', 'Us/Eastern', '2', '4', '3', '5', '4')]
x = [(int(x[0]),x[1],int(x[2]),int(x[3]),int(x[4]),int(x[5]),int(x[6])) for x in y]
print(x)
[(1001794, 'Us/Eastern', 2, 1, 3, 4, 5), (1002041, 'Us/Eastern', 2, 4, 3, 5, 4)]

您只需使用
str.isdigit
[

之外的
x=

[tuple(int(y) if y.isdigit() else y for y in x) for x in tup]
# [(1001794, 'Us/Eastern', 2, 1, 3, 4, 5), ...]
这是假设字符串中的数字是整数。
tup
是您的数据结构


要处理负整数,请使用封装
try except
块的函数(阅读以下内容):

要处理
int
s和
float
s,可以使用嵌套块:

def try_convert(s):
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            return s 

使用
str.isdigit

[tuple(int(y) if y.isdigit() else y for y in x) for x in tup]
# [(1001794, 'Us/Eastern', 2, 1, 3, 4, 5), ...]
这是假设字符串中的数字是整数。
tup
是您的数据结构


要处理负整数,请使用封装
try except
块的函数(阅读以下内容):

要处理
int
s和
float
s,可以使用嵌套块:

def try_convert(s):
    try:
        return int(s)
    except ValueError:
        try:
            return float(s)
        except ValueError:
            return s 

如果您知道
int
的位置,您可以使用来简化您试图使用的列表:

[(int(x), y, *map(int,v)) for x, y, *v in l]

[(1001794, 'Us/Eastern', 2, 1, 3, 4, 5),
 (1001832, 'Us/Central', 2, 3, 4, 4, 5),
 (1001848, 'Us/Central', 2, 4, 5, 4, 5),
 (1001855, 'Us/Central', 2, 1, 4, 4, 5),
 (1001899, 'Us/Central', 2, 1, 4, 3, 5),
 (1001914, 'Us/Pacific', 1, 4, 2, 4, 5),
 (1001971, 'Us/Pacific', 3, 4, 2, 3, 5),
 (1002021, 'Us/Eastern', 2, 1, 4, 4, 5),
 (1002026, 'Us/Central', 2, 1, 4, 4, 2),
 (1002028, 'Us/Eastern', 2, 1, 4, 4, 5),
 (1002041, 'Us/Eastern', 2, 4, 3, 5, 4)]

如果您知道
int
的位置,您可以使用来简化您试图使用的列表:

[(int(x), y, *map(int,v)) for x, y, *v in l]

[(1001794, 'Us/Eastern', 2, 1, 3, 4, 5),
 (1001832, 'Us/Central', 2, 3, 4, 4, 5),
 (1001848, 'Us/Central', 2, 4, 5, 4, 5),
 (1001855, 'Us/Central', 2, 1, 4, 4, 5),
 (1001899, 'Us/Central', 2, 1, 4, 3, 5),
 (1001914, 'Us/Pacific', 1, 4, 2, 4, 5),
 (1001971, 'Us/Pacific', 3, 4, 2, 3, 5),
 (1002021, 'Us/Eastern', 2, 1, 4, 4, 5),
 (1002026, 'Us/Central', 2, 1, 4, 4, 2),
 (1002028, 'Us/Eastern', 2, 1, 4, 4, 5),
 (1002041, 'Us/Eastern', 2, 4, 3, 5, 4)]

这就是你的答案吗

list = []
newList = []

list = [
        ('1001794', 'Us/Eastern', '2', '1', '3', '4', '5'),
        ('1001832', 'Us/Central', '2', '3', '4', '4', '5'),
        ('1001848', 'Us/Central', '2', '4', '5', '4', '5'),
        ('1001855', 'Us/Central', '2', '1', '4', '4', '5'),
        ('1001899', 'Us/Central', '2', '1', '4', '3', '5'),
        ('1001914', 'Us/Pacific', '1', '4', '2', '4', '5'),
        ('1001971', 'Us/Pacific', '3', '4', '2', '3', '5'),
        ('1002021', 'Us/Eastern', '2', '1', '4', '4', '5'),
        ('1002026', 'Us/Central', '2', '1', '4', '4', '2'),
        ('1002028', 'Us/Eastern', '2', '1', '4', '4', '5'),
        ('1002041', 'Us/Eastern', '2', '4', '3', '5', '4')
        ]

newList = [[int(x[0]), x[1], int(x[2]), int(x[3]), int(x[4]), int(x[5]), int(x[6])] for x in list]

print(newList)

这就是你的答案吗

list = []
newList = []

list = [
        ('1001794', 'Us/Eastern', '2', '1', '3', '4', '5'),
        ('1001832', 'Us/Central', '2', '3', '4', '4', '5'),
        ('1001848', 'Us/Central', '2', '4', '5', '4', '5'),
        ('1001855', 'Us/Central', '2', '1', '4', '4', '5'),
        ('1001899', 'Us/Central', '2', '1', '4', '3', '5'),
        ('1001914', 'Us/Pacific', '1', '4', '2', '4', '5'),
        ('1001971', 'Us/Pacific', '3', '4', '2', '3', '5'),
        ('1002021', 'Us/Eastern', '2', '1', '4', '4', '5'),
        ('1002026', 'Us/Central', '2', '1', '4', '4', '2'),
        ('1002028', 'Us/Eastern', '2', '1', '4', '4', '5'),
        ('1002041', 'Us/Eastern', '2', '4', '3', '5', '4')
        ]

newList = [[int(x[0]), x[1], int(x[2]), int(x[3]), int(x[4]), int(x[5]), int(x[6])] for x in list]

print(newList)


因为你在列表理解中做作业。去掉
x=
。我认为这是不允许的?那么列表理解不是这个工具?我不只是想看到它们是那种格式,我希望列表中有那种格式我编辑了我的评论。但是“我要做6个理解”没有意义;它们没有足够的速度比常规的
循环快,不足以证明这种方法的合理性;不要以牺牲合理的代码为代价追求列表理解不,列表理解完全可以做到这一点。但是列表理解中没有赋值语句,只允许表达式。如果你是在赋值方面,即变异状态,那么你不应该使用列表理解,而应该使用常规的for循环。但这可能是一个非常简单的列表理解,毫无疑问是为什么?你已经得到了一个有效的答案。因为你在列表理解中做赋值。摆脱
x=
。我想这是不允许的?那么列表理解就不是这样做的工具了?我不只是想看到他们的格式,我希望列表中有他们的格式。我编辑了我的评论。但是“我要做6个理解”没有意义;它们没有足够的速度比常规的
循环快,不足以证明这种方法的合理性;不要以牺牲合理的代码为代价追求列表理解不,列表理解完全可以做到这一点。但是列表理解中没有赋值语句,只允许表达式。如果你是在赋值方面进行thikning,即变异状态,那么你不应该使用列表理解,而只是使用常规for循环。但这可能是一个非常简单的列表理解,毫无疑问是为什么?你已经得到了一个有效的答案。是的,
tlist=[(int(x[0]),x[1],int(x[2]),int(x[3]),int(x[4]),int(x[5]),int(x[6])for x in tlist中的x]
对我来说是可行的。这是可行的,但是硬编码一切,包括不应该转换的字符串的位置。是的,
tlist=[(int(x[0])、x[1]、int(x[2])、int(x[3])、int(x[4])、int(x[5])、int(x[6])表示tlist中的x]
对我来说很有用。这是可行的,但硬编码所有内容,包括不应转换的字符串的位置。我喜欢这个答案。感谢您指出
isdigit
的有用性。这是一个不错的方法,只要所有看起来像数字的字符串看起来都像正整数。“-2”例如,将保留一个字符串。我将把它给这一个bc,这是一个很好的通用解决方案,以防其他人有类似的问题。我会说,
isdigit
在这里不好。相反,将您的
may\u int
封装在一个函数中,该函数使用
try:return int(obj)除了ValueError:返回obj
。或者只是硬编码。元组应该是规则的。@Kevin Fixed,tyI喜欢这个答案。感谢您指出
isdigit
的有用性。这是一个不错的方法,只要所有看起来像数字的字符串看起来都像正整数。“-2”例如,将保留一个字符串。我将把它给这一个bc,这是一个很好的通用解决方案,以防其他人有类似的问题。我会说,
isdigit
在这里不好。相反,将您的
may\u int
封装在一个函数中,该函数使用
try:return int(obj)除了ValueError:返回obj
。或者只是硬编码。元组应该是规则的。@Kevin Fixed,ty