【问题标题】:Python slicing list of tuples and converting values to integers - Confusion regarding why it's possible with numpy arrays but not list of tuplesPython 切片元组列表并将值转换为整数 - 关于为什么可以使用 numpy 数组而不是元组列表的困惑
【发布时间】: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'

或将startend转为整数

>>>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


【解决方案1】:

如果您只想将第一个和最后一个数字转换为整数,您可以这样做:

a = [('1', 'T', ''), ('2', 'R', 'S'), ('3', 'E', 'S'), ('4', 'T', 'S')]

firstNum = int(a[0][0])
lastNum = int(a[-1][0])

print(firstNum)
print(lastNum)

不需要切片或其他复杂的逻辑。 并且您收到错误,因为您无法将元组转换为整数,选择元组内的项目然后将其转换

【讨论】:

  • 谢谢。这比我正在做的要简单得多。谢谢。
【解决方案2】:

您正在使用切片进行索引,它返回一个列表(或元组)。用数字(标量)索引从列表(或元组)中取出一个元素:

In [8]: a=[('1', 'T', ''), ('2', 'R', 'S'), ('3', 'E', 'S'), ('4', 'T', 'S')]                  
In [9]: b=[x[0] for x in a]                                                                    
In [10]: b                                                                                     
Out[10]: ['1', '2', '3', '4']
In [11]: b[0]                                                                                  
Out[11]: '1'
In [12]: int(b[0])                                                                             
Out[12]: 1
In [13]: b[-1]                                                                                 
Out[13]: '4'    # int(b[-1]) works

与数组类似。切片索引保留维度,标量索引减少维度:

In [14]: arr = np.array(a)                                                                     
In [15]: arr                                                                                   
Out[15]: 
array([['1', 'T', ''],
       ['2', 'R', 'S'],
       ['3', 'E', 'S'],
       ['4', 'T', 'S']], dtype='<U1')
In [16]: arr[0,:]                                                                              
Out[16]: array(['1', 'T', ''], dtype='<U1')
In [17]: arr[:,0]                                                                              
Out[17]: array(['1', '2', '3', '4'], dtype='<U1')

注意arr dtype;我们可以把它改成int:

In [18]: arr[:,0].astype(int)                                                                  
Out[18]: array([1, 2, 3, 4])

一般来说,您不想使用int(b_array[0:1,0:1])。它适用于一个数字,但不能用于多个:

In [19]: int(arr[:,0])                                                                         
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-19-9c2041fff718> in <module>
----> 1 int(arr[:,0])

TypeError: only size-1 arrays can be converted to Python scalars

list 索引是 Python 原始索引。 numpy 已扩展此索引。 numpy 扩展尚未向后移植到 list


您可能错过了对列表进行迭代将项目从列表中取出。

In [26]: [x for x in a[:2]]                                                                    
Out[26]: [('1', 'T', ''), ('2', 'R', 'S')]

等价于标量索引:

In [27]: [a[i] for i in range(2)]                                                              
Out[27]: [('1', 'T', ''), ('2', 'R', 'S')]

使用 slice 'wraps' 列表中的每个 x 进行索引:

In [28]: [a[i:i+1] for i in range(2)]                                                          
Out[28]: [[('1', 'T', '')], [('2', 'R', 'S')]]

b=[list[0:1] for list in a] 中,lista 中的元组之一。它不是a 中的slice

In [29]: a[0][0:1]         # slice of a tuple from a list                                                                             
Out[29]: ('1',)
In [30]: a[0:1][0:1]       # slice of a slice                                      
Out[30]: [('1', 'T', '')]
In [31]: a[0][0]           # element of a tuple from the list                                                  
Out[31]: '1'

【讨论】:

  • 谢谢我非常感谢详尽的描述。这就是我要找的!看来我真的不明白我在做什么!
猜你喜欢
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-03-16
  • 2018-05-03
  • 1970-01-01
  • 1970-01-01
  • 2016-01-11
  • 2011-07-27
相关资源
最近更新 更多