Just got into python and I have to convert all string elements of a 2-D list to int except the first element. For example, for a list-
result = [['foo', '2', '21', '48'], ['bar', '18', '180', '54']]
I only wish to change the type of the "numbers" in the list to int type (say- '2', '21', '48' in first row).
I have tried using list comprehension,
result = [int(x) for x in result[i]]
# where i is the traversal variable
but this gives
invalid literal for int() with base 10: 'foo'
which is precisely what I am trying to avoid doing.
Any ideas on how to achieve this without creating another copy of the list as I want to reflect the changes back to the original list?
Apologies if I missed something very basic.
CodePudding user response:
result = [int(x) for x in result[i][1:]]
try this
CodePudding user response:
Perhaps you're looking for str.isdigit
:
out = [[int(x) if x.isdigit() else x for x in lst] for lst in result]
Output:
[['foo', 2, 21, 48], ['bar', 18, 180, 54]]
CodePudding user response:
You need to use list slicing to ignore the first element in each list. The most concise way of accomplishing this is by using map()
:
result = [['foo', '2', '21', '48'], ['bar', '18', '180', '54']]
for sublist in result:
sublist[1:] = map(int, sublist[1:])
# Prints [['foo', 2, 21, 48], ['bar', 18, 180, 54]]
print(result)
CodePudding user response:
If you're confident about all elements after the first one in each sublist being numeric (or you want to enforce that assumption such that an exception will be raised if it's violated), you could do the type conversion based on the index rather than the value, e.g.:
>>> result = [['foo', '2', '21', '48'], ['bar', '18', '180', '54']]
>>> result = [[int(x) if i else x for i, x in enumerate(row)] for row in result]
>>> result
[['foo', 2, 21, 48], ['bar', 18, 180, 54]]