将列表中的某些值更改为整数? Python
Change certain values in a list to integers? Python
我从文件创建了这本词典。它有一个带有值列表的键。列表中的元素都是字符串。我想将索引 1 到 3 处的元素转换为整数。
这是我字典里的 key:value。
{'Youngstown': ['OH', '4110', '8065', '115436'].....}
我想将 'OH' 保留为字符串,并将所有其他元素转换为整数。
像这样:
{'Youngstown': ['OH', 4110, 8065, 115436].....}
这是我目前的代码。
d3 = {}
for k,v in d2.items():
for i in v:
for v in range(1,3):
d3[k] = int(v)
print(d3)
然而,这只会给出以下结果:
{'Youngstown': 2, ...}
这是在python.
您的问题是您每次通过内部 for
循环都会覆盖 d3[k]
的值(这也会错误地覆盖 v
值)。您需要将 d3[k]
设置为列表,然后将 int
值附加到它。例如:
for k, v in d2.items():
d3[k] = [v[0]]
for i in range(1, 4):
d3[k].append(int(v[i]))
您也可以考虑使用 str.isnumeric()
来检查值,并且仅在为真时才进行转换。例如:
for k, v in d2.items():
d3[k] = [int(i) if i.isnumeric() else i for i in v]
然后可以将其包装到嵌套理解中:
d3 = { k : [int(i) if i.isnumeric() else i for i in v] for k, v in d2.items() }
鉴于:
di={'Youngstown': ['OH', '4110', '8065', '115436'],'Columbus':['OH','1','2','3']}
如果可能的话,您可以编写一个使用 try / except
转换整数的小函数:
def conv(e):
try:
return int(e)
except ValueError:
return e
di={k:[conv(e) for e in v] for k,v in di.items()}
>>> di
{'Youngstown': ['OH', 4110, 8065, 115436], 'Columbus': ['OH', 1, 2, 3]}
要就地更改列表,您可以分配给列表的一部分。这形成了一个可读的简单循环:
d3 = {
'Youngstown': ['OH', '4110', '8065', '115436'],
'Anchorage': ['AK', '5432', '1232', '350492']
}
for l in d3.values():
l[1:] = map(int, l[1:])
在此之后,d3
将如下所示:
{'Youngstown': ['OH', 4110, 8065, 115436],
'Anchorage': ['AK', 5432, 1232, 350492]}
如果索引3以外的元素不想触及,可以定义切片的最终边界:
l[1:4] = map(int, l[1:4])
这应该可以满足您的要求:
d3 = {}
for k,v in d2.items():
d3[k] = [v[0]] + [int(n) for n in v[1:]]
对于字典的每个元素,它构造一个新列表,复制第一个元素不变并将 int()
应用于其余元素。然后将结果存储在新的 dict
.
中
示例:d2
具有以下值:
d2 = {'Youngstown': ['OH', '4110', '8065', '115436'],
'foo': ['x', '10', '20', '30']}
它为 d3
生成以下内容:
{'Youngstown': ['OH', 4110, 8065, 115436], 'foo': ['x', 10, 20, 30]}
我从文件创建了这本词典。它有一个带有值列表的键。列表中的元素都是字符串。我想将索引 1 到 3 处的元素转换为整数。
这是我字典里的 key:value。
{'Youngstown': ['OH', '4110', '8065', '115436'].....}
我想将 'OH' 保留为字符串,并将所有其他元素转换为整数。
像这样:
{'Youngstown': ['OH', 4110, 8065, 115436].....}
这是我目前的代码。
d3 = {}
for k,v in d2.items():
for i in v:
for v in range(1,3):
d3[k] = int(v)
print(d3)
然而,这只会给出以下结果:
{'Youngstown': 2, ...}
这是在python.
您的问题是您每次通过内部 for
循环都会覆盖 d3[k]
的值(这也会错误地覆盖 v
值)。您需要将 d3[k]
设置为列表,然后将 int
值附加到它。例如:
for k, v in d2.items():
d3[k] = [v[0]]
for i in range(1, 4):
d3[k].append(int(v[i]))
您也可以考虑使用 str.isnumeric()
来检查值,并且仅在为真时才进行转换。例如:
for k, v in d2.items():
d3[k] = [int(i) if i.isnumeric() else i for i in v]
然后可以将其包装到嵌套理解中:
d3 = { k : [int(i) if i.isnumeric() else i for i in v] for k, v in d2.items() }
鉴于:
di={'Youngstown': ['OH', '4110', '8065', '115436'],'Columbus':['OH','1','2','3']}
如果可能的话,您可以编写一个使用 try / except
转换整数的小函数:
def conv(e):
try:
return int(e)
except ValueError:
return e
di={k:[conv(e) for e in v] for k,v in di.items()}
>>> di
{'Youngstown': ['OH', 4110, 8065, 115436], 'Columbus': ['OH', 1, 2, 3]}
要就地更改列表,您可以分配给列表的一部分。这形成了一个可读的简单循环:
d3 = {
'Youngstown': ['OH', '4110', '8065', '115436'],
'Anchorage': ['AK', '5432', '1232', '350492']
}
for l in d3.values():
l[1:] = map(int, l[1:])
在此之后,d3
将如下所示:
{'Youngstown': ['OH', 4110, 8065, 115436],
'Anchorage': ['AK', 5432, 1232, 350492]}
如果索引3以外的元素不想触及,可以定义切片的最终边界:
l[1:4] = map(int, l[1:4])
这应该可以满足您的要求:
d3 = {}
for k,v in d2.items():
d3[k] = [v[0]] + [int(n) for n in v[1:]]
对于字典的每个元素,它构造一个新列表,复制第一个元素不变并将 int()
应用于其余元素。然后将结果存储在新的 dict
.
示例:d2
具有以下值:
d2 = {'Youngstown': ['OH', '4110', '8065', '115436'],
'foo': ['x', '10', '20', '30']}
它为 d3
生成以下内容:
{'Youngstown': ['OH', 4110, 8065, 115436], 'foo': ['x', 10, 20, 30]}