2009-05-04 4 views

ответ

41
changed_list = [int(f) if f.isdigit() else f for f in original_list] 
+3

Элегантный однострочный. Вот сила понимания списков. – mkClark

+0

думал о похожих строках – Nope

+0

Хорошее решение, но что, если в списке есть значения с плавающей запятой, также '['batting average', '306', 'ERA', '1710.5']' –

5

Данные выглядят так, как вы знаете, в каких позициях должны быть номера. В этом случае, вероятно, лучше явно преобразовать данные в этих положениях, вместо того, чтобы просто преобразовать все, что выглядит как номер:

ls = ['batting average', '306', 'ERA', '1710'] 
ls[1] = int(ls[1]) 
ls[3] = int(ls[3]) 
+0

Yep это лучшее решение для статического случая, в то время как Алекс лучше всего подходит для динамического случая. – Unknown

5

Попробуйте это:

def convert(someList): 
    for item in someList: 
     try: 
      yield int(item) 
     except ValueError: 
      yield item 

newList= list(convert(oldList)) 
0
a= ['batting average', '306', 'ERA', '1710.5'] 

[f if sum([c.isalpha() for c in f]) else float(f) for f in a ] 

если список содержит поплавок , string и int (как указано в @ d.putto в комментарии)

+1

'sum ([c.isalpha() для c в f])' довольно субоптимальный способ проверить «если какой-либо символ из f является алфавитным» - попробуйте 'any (c.isalpha() для c в f) 'для повышения удобочитаемости и производительности. Конечно, оба будут терпеть неудачу, если 'f' равно, например,' '! '' - строка, которая не является номером, но не имеет буквенно-цифровых символов, а также не может преобразовать, например, '' 1.7e3'' - строку, которая содержит буквенно-цифровой символ, но, тем не менее, будет отлично передаваться как аргумент 'float' (« экспоненциальная нотация »). –

+0

true. хороший момент ... отправил его только для ответа на конкретный надуманный пример d.putto. Должен был подумать, прежде чем публиковать мой полупеченный ответ! –