Reputation: 27
I have to convert all string elements of a 2-D list to integers except for 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 a 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.
Any ideas on how to achieve this without creating another copy of the list? I want to reflect the changes back to the original list.
Upvotes: 1
Views: 629
Reputation: 71562
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]]
Upvotes: 1
Reputation: 19252
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)
Upvotes: 1
Reputation:
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]]
Upvotes: 3