Ваш код, вероятно, получает ошибку из-за этой строки:
for i in list1[i][i]:
...
Не ясно, каково значение i
при оценке list[i][i]
, но оно не будет работать независимо от того, что вы хотели бы сделать, циклически перебирая свой основной список, а также внутри каждого из его элементов, что также списки.
В то время как вы могли бы понять это с помощью явной индексации, Python предлагает вам лучший подход, а именно, циклический просмотр элементов напрямую.
Самое главное, в общем, ваш подход с регулярными выражениями не будет работать, потому что:
re.sub('x', ', ', list1[0][0])
фактически создает строку, которая при печати выглядит идентично тому, как Python печатает список чисел, , но это не список чисел !
Вместо этого вы хотите преобразовать вашу строку в числовой тип.
Если все, что вам нужно, это список float
с, то просто приведение правильного текстового представления float
сделает то же самое, например. float('1.5') == 1.5
. То же самое относится и к int
, например, int('432') == 432
(но int('1.5')
повысит ValueError
).
Если вы хотите иметь разные объекты для int
с и float
с, как показывает ожидаемый результат, вы можете сначала попытаться преобразовать в int
, а если это не удастся, преобразовать в float
:
def to_number(value):
try:
value = int(value)
except ValueError:
value = float(value)
finally:
return value
Имея это в виду, теперь вам нужно убедиться, что ввод этой функции будет строкой с числом.
Очевидно, что 1x2
или даже 1, 2
нет, то есть и int('1x2')
и int('1, 2')
(или с float
вместо int
) повысится на ValueError
.
Тем не менее, Python предлагает простой способ синтаксического анализа (ну, разделения) этой строки таким образом, что вы получите '1'
и '2'
в списке:
'1x2'.split('x') == ['1', '2']
Это также имеет довольно мягкое поведение, заключающееся в изящном создании согласованного вывода, даже если вы применяете это к тексту, не содержащему char
для разделения, например ::
'1'.split('x') == ['1']
Со всеми этими строительными блоками теперь можно найти разумное решение (с интенсивным использованием списочных представлений):
list2 = [
[to_number(x) for elem in inner_list for x in elem.split('x')]
for inner_list in list1]
print(list2)
# [[2.6, 3.65], [], [2, 2.9, 1.7, 2.5, 1.3]]
( РЕДАКТИРОВАТЬ : добавили ряд объяснений и полностью написали код в виде списочных пониманий).