How to convert list of intable strings to int

前端 未结 6 1359
我在风中等你
我在风中等你 2020-12-06 13:28

In Python, I want to convert a list of strings:

l = [\'sam\',\'1\',\'dad\',\'21\']

and convert the integers to integer types like this:

相关标签:
6条回答
  • 2020-12-06 13:36

    I would create a generator to do it:

    def intify(lst):
        for i in lst:
            try:
                i = int(i)
            except ValueError:
                pass
            yield i
    
    lst = ['sam','1','dad','21']
    intified_list = list(intify(lst))
    # or if you want to modify an existing list
    # lst[:] = intify(lst)
    

    If you want this to work on a list of lists, just:

    new_list_of_lists = map(list, map(intify, list_of_lists))
    
    0 讨论(0)
  • 2020-12-06 13:37

    I'd use a custom function:

    def try_int(x):
        try:
            return int(x)
        except ValueError:
            return x
    

    Example:

    >>> [try_int(x) for x in  ['sam', '1', 'dad', '21']]
    ['sam', 1, 'dad', 21]
    

    Edit: If you need to apply the above to a list of lists, why didn't you converted those strings to int while building the nested list?

    Anyway, if you need to, it's just a matter of choice on how to iterate over such nested list and apply the method above.

    One way for doing that, might be:

    >>> list_of_lists = [['aa', '2'], ['bb', '3']]
    >>> [[try_int(x) for x in lst] for lst in list_of_lists]
    [['aa', 2], ['bb', 3]]
    

    You can obviusly reassign that to list_of_lists:

    >>> list_of_lists = [[try_int(x) for x in lst] for lst in list_of_lists]
    
    0 讨论(0)
  • 2020-12-06 13:42

    Use isdigit() to check each character in the string to see if it is a digit.

    Example:

    mylist = ['foo', '3', 'bar', '9']
    t = [ int(item) if item.isdigit() else item for item in mylist ] 
    print(t)
    
    0 讨论(0)
  • 2020-12-06 13:43

    How about using map and lambda

    >>> map(lambda x:int(x) if x.isdigit() else x,['sam','1','dad','21'])
    ['sam', 1, 'dad', 21]
    

    or with List comprehension

    >>> [int(x) if x.isdigit() else x for x in ['sam','1','dad','21']]
    ['sam', 1, 'dad', 21]
    >>> 
    

    As mentioned in the comment, as isdigit may not capture negative numbers, here is a refined condition to handle it notable a string is a number if its alphanumeric and not a alphabet :-)

    >>> [int(x) if x.isalnum() and not x.isalpha() else x for x in ['sam','1','dad','21']]
    ['sam', 1, 'dad', 21]
    
    0 讨论(0)
  • 2020-12-06 13:43

    For multidimenson lists, use recursive technique may help.

    from collections import Iterable
    def intify(maybeLst):
        try:
            return int(maybeLst)
        except:
            if isinstance(maybeLst, Iterable) and not isinstance(lst, str):
                return [intify(i) for i in maybeLst] # here we call intify itself!
            else:
                return maybeLst
    
    maybeLst = [[['sam', 2],'1'],['dad','21']]
    print intify(maybeLst) 
    
    0 讨论(0)
  • 2020-12-06 13:52
    • Use a list comprehension to validate the numeracy of each list item.
    • str.isnumeric won't pass a negative sign
      • Use str.lstrip to remove the -, check .isnumeric, and convert to int if it is.
      • Alternatively, use str.isdigit in place of .isnumeric.

    Keep all values in the list

    l = ['sam', '1', 'dad', '21', '-10']
    
    t = [int(v) if v.lstrip('-').isnumeric() else v for v in l]
    
    print(t)
    
    >>> ['sam', 1, 'dad', 21, -10]
    

    Remove non-numeric values

    l = ['sam', '1', 'dad', '21', '-10']
    
    t = [int(v) for v in t if v.lstrip('-').isnumeric()]
    
    print(t)
    
    >>> [1, 21, -10]
    

    Nested list

    l = [['aa', '2'], ['bb', '3'], ['sam', '1', 'dad', '21', '-10']]
    
    t = [[int(v) if v.lstrip('-').isnumeric() else v for v in x] for x in l]
    
    print(t)
    
    >>> [['aa', 2], ['bb', 3], ['sam', 1, 'dad', 21, -10]]
    
    0 讨论(0)
提交回复
热议问题