Я пытаюсь вырезать первое и последнее значения из списка, а затем преобразовать эти значения в целые числа. Я нашел решение, но меня смущает, почему это решение работает, и мне интересно, есть ли более простой способ, поскольку он кажется довольно не элегантным.
Два способа, которые я нашел, чтобы вырезать одно значение из списка списка, это либо использовать понимание списка, а затем нарезать или преобразовать в массив numpy, а затем разделить на два измерения. Оба из них делают два шага.
Вопрос 1 : существует ли одношаговое решение для вырезания одного значения из списка списка?
Вопрос 2 : Почему смешанный список (некоторые значения являются числами и некоторые буквы) не состоит из целых чисел и строк против всех кортежей? * Массивы numpy или другой подход разрешают смешанные списки? Извините, если я не использую правильную терминологию ...
Список нарезки списка - метод понимания списка
#Say I have a list of a list with mixed numbers and letters.
>>>a=[('1', 'T', ''), ('2', 'R', 'S'), ('3', 'E', 'S'), ('4', 'T', 'S')]
#list comprehension slice 1D
>>>b=[list[0:1] for list in a]
>>> print(b):
[('1',), ('2',), ('3',), ('4',)]
>>> start=(b[0:1])
>>> print(start):
[('1',)]
>>> end=b[len(b)-1:len(b)]
>>> print(end)
[('4',)]
Список нарезки списка - numpy метод массива #Say I есть список из списка со смешанными числами и буквами.
>>>a=[('1', 'T', ''), ('2', 'R', 'S'), ('3', 'E', 'S'), ('4', 'T', 'S')]
>>> b_array=numpy.array(a)
>>> print(b_array)
array([['1', 'T', ''],
['2', 'R', 'S'],
['3', 'E', 'S'],
['4', 'T', 'S']], dtype='<U1')
>>>start_array = b_array[0:1,0:1]
>>>print(start_array)
array([['1']], dtype='<U1')
>>>end_array = b_array[len(b_array)-1:len(b_array),0:1]
>>>print(end_array)
array([['4']], dtype='<U1')
Оба подхода работают, но меня смущает то, что они ведут себя по-разному, если я вызываю для них int (). Понимание списка Если я использую понимание списка, чтобы попробовать чтобы превратить все b
в целые числа
>>>b_int= [int(i) for i in b]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "<stdin>", line 1, in <listcomp>
TypeError: int() argument must be a string, a bytes-like object or a number, not 'tuple'
или превратить start
или end
в целые числа
>>>start=int(b[0:1])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: int() argument must be a string, a bytes-like object or a number, not 'list'
Я получаю похожие ошибки. Но вторая говорит, что это список, хотя это одно значение в списке 1x1.
В качестве альтернативы, если я делаю то же самое для start_array
, это нормально
>>>start_array=int(b_array[0:1,0:1])
>>>print(start_array)
1
Итак, в итоге, Я нашел рабочее решение, но оно кажется неуклюжим, и я не понимаю, почему это работает в numpy массивах, а не в списке списков.
Вопрос 3 : Почему я могу преобразовать значения в массивах numpy в целые числа, а не в списки списков?
Вопрос 4 : Есть ли чище или проще способ сделать это в python?
Спасибо
edit: Итак, мое недоразумение заключалось в том, что я думал, что имею дело со списком списков. Я не был, вместо этого я работал со списком кортежей. Я изменил название, но не тело. Вторая проблема заключалась в том, что я выполнял индексацию срезов, а не скалярную индексацию. Это привело к тому, что мои элементы не были удалены из списка. Для решений я мог бы либо:
#List comprehension to reduce dimensionality
a=[('1', 'T', ''), ('2', 'R', 'S'), ('3', 'E', 'S'), ('4', 'T','S')]
b=[x[0] for x in a]
start=int(b[0])
end=int(b[-1])
#Directly index with a scalar
start=int(b[0][0])
end=int(b[-1][0])
Я буду непосредственно индексировать со скаляром, поскольку это проще. Хотя, если бы я хотел проиндексировать несколько списков чисел, было бы более полезным.