所以我有一个函数,它接受一个列表列表,并根据值代表的值改变每个值的类型:
def change_list(x):
"""
Convert every str in x to an int if it represents a
integer, a float if it represents a decimal number, a bool if it is
True/False, and None if it is either 'null' or an empty str
>>> x = [['xy3'], ['-456'], ['True', '4.5']]
>>> change_list(x)
>>> x
[['xy3' , -456], [True], [4.5]]
"""
for ch in x:
for c in ch:
if c.isdigit() == True:
c = int(c)
我只发布了部分代码,我感觉好像一旦我可以将其排序,我可以在其他if / elif / else中应用类似的方法,以便能够直接得到它。我的问题是,当我应用这种方法,然后再次调用x时,列表仍然以字符串而不是整数或浮点数或布尔值返回。
即如果我在执行此函数后调用x,我会得到:
x = [['xy3'], ['-456'], ['True', '4.5']]
而不是函数中的示例代码中的内容。 我不确定出了什么问题,任何建议都会有所帮助。
答案 0 :(得分:1)
因为当你这样做时:
for ch in x:
for c in ch:
if c.isdigit() == True:
c = int(c) #yes it changed the type but it doesn't stroed in list
是的,您正在更改类型,但您在哪里存储更改的内容?
为此,您必须告诉列表在该索引处更改,为此,您可以使用枚举:
item[index]=int(item1)
你在float上使用isdigit()的第二件事是无效的:
str.isdigit()只有在字符串中的所有字符都返回true 是数字。 。 - 是标点符号,而不是数字。
所以你可以试试这两种方法:
第一种方法:
x = [['xy3'], ['-456'], ['True', '4.5']]
for item in x:
if isinstance(item,list):
for index,item1 in enumerate(item):
if item1.replace("-","").isdigit():
item[index]=int(item1)
elif item1.replace(".","").isdigit():
item[index]=float(item1)
print(x)
输出:
[['xy3'], [-456], ['True', 4.5]]
或者如果你想要你可以将所有int转换为float:
x = [['xy3'], ['-456'], ['True', '4.5']]
for item in x:
if isinstance(item,list):
for index,item1 in enumerate(item):
if item1.replace("-","").replace(".","").isdigit():
item[index]=float(item1)
print(x)
第二种方法:
您可以定义自己的isdigit()
功能:
x = [['xy3'], ['-456'], ['True', '4.5']]
def isdigit(x):
try:
float(x)
return True
except ValueError:
pass
然后一行解决方案:
print([[float(item1) if '.' in item1 else int(item1)] if isdigit(item1) else item1 for item in x if isinstance(item,list) for index,item1 in enumerate(item)])
详细解决方案:
for item in x:
if isinstance(item,list):
for index,item1 in enumerate(item):
if isdigit(item1)==True:
if '.' in item1:
item[index]=float(item1)
else:
item[index]=int(item1)
print(x)
输出:
[['xy3'], [-456], ['True', 4.5]]
答案 1 :(得分:0)
您需要更改列表元素本身,而不是本地参考c
或ch
:
for i,ch in enumerate(x):
if ch ... # whatever logic
x[i] = ... # whatever value
答案 2 :(得分:0)
您没有更新列表。你只是为这个值分配另一个值,嗯......没什么。使用enumerate
函数及其提供的索引值,然后使用索引更改值。
for ch in x:
for c in ch:
if c.isdigit() == True:
c = int(c) # You're doing 'xyz' = int('xyz') which does nothing
更好的是,由于您希望根据当前列表生成新列表,因此最好选择map
inp_list = [...] # Your list
out_list = list(map(lambda nums: int(n) for n in nums if n.isDigit(), inp_list))
# The above is for only integer conversion but you get the idea.
答案 3 :(得分:0)
目前您正在使用列表的值,但不会更新它。因此,您需要枚举它,并通过引用它直接更改列表元素。
正确的代码如下所示:
for idx,ch in enumerate(x):
for idx2,c in enumerate(ch):
if c.isdigit() == True:
x[idx][idx2] = int(c)
答案 4 :(得分:0)
<div *ngFor="let object of objects | paginate: { itemsPerPage: 10, currentPage: p }">
<div (click)="gotoObject(object.id)">
{{object.id}}
</div>
</div>
<pagination-controls class="pagination" (pageChange)="p = $event;getPage($event)"></pagination-controls>
和isdigit
无效,因为&#39; -456&#39;包含isnumeric
和&#39; 4.5&#39;包含&#39;。&#39;
取而代之的是:
-
<强>输出强>
x = [['xy3'], ['-456'], ['True', '4.5'], ['3']]
for ch in x:
for i in range(len(ch)):
try:
ch[i] = float(ch[i])
if int(ch[i]) == ch[i]:
ch[i] = int(ch[i])
except:
if ch[i] in ['True', 'False']:
ch[i] = (['True', 'False'][0] == ch[i])
print(x)
答案 5 :(得分:0)
首先:isdigit为负值返回false,表示你没有得到X中的整数
>>> x[1][0].isdigit()
False
<强>第二强>:
您没有在x
c = int(c)
x = [['xy3'], ['-456'], ['True', '4.5']]
for index, value in enumerate(x):
for i,v in enumerate(value):
try:
x[index][i] = eval(v)
except:
pass