2012-03-19 3 views
1

Я вложен список следующего вида:Вложенный список - Струны для Поплавок

my_list = [['Some1', '2', '3.6', '4.5', 'GB2', '6'], 
      ['Some2', '3.9', '4', '5', 'HG5', '7.3'], 
      ['Some3', '4', '5', '6.1', 'H2D', '8.9']] 

Каждый элемент каждого подсписка является строкой, но я хотел бы, чтобы включить все чисто числовые строки в поплавков.

Так что попробуйте следующий код:

for row in my_list: 
    for k, item in enumerate(row): 
     if k in (1, 2, 3, 5): 
      item = float(item) 

К сожалению, вложенный список остается неизменным. Я уверен, что делаю простую ошибку, но я не вижу этого. Любая помощь (и контекст) была бы оценена.

ответ

4

Переназначение имени item никогда не изменит список. Попробуйте это вместо:

for row in my_list: 
    for k in (1, 2, 3, 5): 
     row[k] = float(row[k]) 

Обратите внимание, что имена Python - это только теги, прикрепленные к некоторым объектам. Линия как

item = float(item) 

вычислит float(item), а затем связать имя item для возвращаемого объекта. Это ничего не делает для объекта item, на который указывалось ранее. Более того, в этом случае невозможно мутировать последний объект на месте - строки неизменяемы.

+0

которые будут рассмотрены более вещий в этом случае для цикла или списка понимания, создающего my_list2 как DSM предлагает? Является ли тот или иной предпочтительным? Мои фактические списки могут достигать 100 000 + строк. – donopj2

+0

@PatrickD: Два ответа делают разные вещи. Код в моем ответе изменяет исходный список на месте. Код в ответе DSM создает новый список. Другое отличие состоит в том, что код в моем ответе жестко кодирует, какие столбцы для преобразования, и будет выходить из строя, если какое-то значение не может быть преобразовано. Код в ответе DSM пытается преобразовать каждый элемент и использует значение с плавающей запятой вместо исходного значения, если преобразование завершается успешно. Код в этом ответе быстрее и потребляет меньше памяти, если вы хотите эту семантику. –

4

Вы не влияете на исходный список; вы просто делаете float из некоторых элементов и в свою очередь называете его «item». Вы можете использовать что-то вроде

row[k] = float(item) 

, но я бы, вероятно, сделать что-то вроде

def floatify(x): 
    try: 
     return float(x) 
    except ValueError: 
     return x 

my_list2 = [[floatify(x) for x in row] for row in my_list] 
0

Вам нужно будет переназначить элементы строки к новому вычисленному значению, например,

row[k] = float(item) 
1
for index1, row in enumerate(my_list): 
    for index2, item in enumerate(row): 
     try: 
      my_list[index1][index2] = (float(item)) 
     except ValueError: 
      pass 
print my_list 
[['Some1', 2.0, 3.6000000000000001, 4.5, 'GB2', 6.0], 
['Some2', 3.8999999999999999, 4.0, 5.0, 'HG5', 7.2999999999999998], 
['Some3', 4.0, 5.0, 6.0999999999999996, 'H2D', 8.9000000000000004]] 

 Смежные вопросы

  • Нет связанных вопросов^_^