【发布时间】:2020-02-14 07:11:27
【问题描述】:
我正在尝试从列表列表中分割第一个和最后一个值,然后将这些值转换为整数。我找到了一个解决方案,但我很困惑为什么这个解决方案有效,并且想知道是否有更简单的方法,因为它看起来相当不优雅。
我发现从列表的列表中切片单个值的两种方法是使用列表理解然后切片或转换为 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数组方法 #假设我有一个包含混合数字和字母的列表。
>>>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])
我将直接使用标量进行索引,因为它更简单。虽然如果我想索引几个数字列表理解会更有用。
【问题讨论】:
-
您可以使用
b=[int(tup[0]) for tup in a]从元组列表中获取每个元组的第一个值并转换为int。如果要访问第一个和最后一个值,请使用b[0]和b[-1]。您的原始列表是元组列表而不是列表列表。有关列表索引的详细信息,请参阅 [此处](python-reference.readthedocs.io/en/latest/docs/brackets/…) -
1) 你没有很多列表,你有一个元组列表 2)
numpy更擅长多维切片是numpy的主要卖点之一和为什么我们甚至有字符串和对象ndarrays 之类的东西(否则numpy是为计算而设计的)3)花哨的索引使得提取第一个和最后一个元素更容易:start = b[[0]], end = b[[-1]] -
哦,我明白了。我误解了元组是什么......所以这就是括号格式中括号的意义。我的不好-感谢您的澄清
标签: python arrays list numpy tuples