更改列表列表中的类型(Python)

时间:2017-10-30 03:53:41

标签: python list types

所以我有一个函数,它接受一个列表列表,并根据值代表的值改变每个值的类型:

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']]

而不是函数中的示例代码中的内容。 我不确定出了什么问题,任何建议都会有所帮助。

6 个答案:

答案 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)

您需要更改列表元素本身,而不是本地参考cch

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