在Python中反转一个列表中的子列表元素

3

I have a numpy array of top 2 labels:

n =  [['20011' '20048']
     ['20011' '20048']
     ['20011' '20048']
     ['20011' '20048']]

我想以相反的顺序获取它们:
[['20048' '20011']
 ['20048' '20011']
 ['20048' '20011']]

如何在保持格式不变的情况下实现这个目标?
到目前为止的代码如下:
n = model1.classes_[order[:,-5:]]
print(n)
r = [p[::-1] for p in n]
print(r)

输出:

[array(['20048', '20011'], 
      dtype='|S5'), array(['20048', '20011'], 
      dtype='|S5'), array(['20048', '20011'], 
      dtype='|S5'), array(['20048', '20011'], 
      dtype='|S5')]

需要尝试去除“dtypes”,只保留反转的数组。

SO不是一个代码编写服务,如果你想得到一个合适的答案,你需要更新你的问题,附上你已经尝试过的代码和一个最小、完整、可验证的示例 - Mazdak
1
[L[::-1] for L in lists] - nneonneo
@minks,请添加打印数组的实际输出。 - Padraic Cunningham
@PadraicCunningham: 已添加 - minks
我已经编辑了我的回答,如果你想让最终结果保存到文件中,你可以按照我在编辑中的做法。 - Padraic Cunningham
你也可以看到dtype,因为现在你有一个包含numpy数组的列表,你完全不需要使用Python逻辑来翻转子数组。 - Padraic Cunningham
3个回答

5

你的列表似乎缺少逗号,因此每个列表实际上只有一个字符串,但如果你想修改原始子列表,可以使用list.reverse来进行就地操作:

for sub in lists:
     sub.reverse()

您实际上拥有一个numpy数组,所以假设它的格式正确,您可以:

In [50]: arr
Out[50]: 
array([['20015', '20013', '20044', '20001', '20002'],
       ['20002', '20015', '20001', '20013', '20070']], 
      dtype='|S5')

In [51]: arr[:,::-1]
Out[51]: 
array([['20002', '20001', '20044', '20013', '20015'],
       ['20070', '20013', '20001', '20015', '20002']], 
      dtype='|S5')

保存像这样的内容到文件中:

In [57]: arr[:,::-1].tofile("out.txt",sep=",")

In [58]: cat out.txt
20002,20001,20044,20013,20015,20070,20013,20001,20015,20002

如果您想要每行一个数据的话,请使用savetxt函数:
In [94]: np.savetxt("out.txt",arr[:,::-1],fmt="%s")

In [95]: cat out.txt
20002 20001 20044 20013 20015
20070 20013 20001 20015 20002

您也可以在一行代码中实现它:[sub.reverse() for sub in lists] - zondo
@zondo,没错,但你会使用列表推导式来产生副作用并创建一个由None组成的列表。 - Padraic Cunningham
@zondo 这个不行,我得到了 [None, None, None, None]。 - Richard Rublev
1
当然,这就是为什么它只是一条注释。 - zondo
@RichardRublev:不要给它分配任何东西。我的评论将独立执行。反转是在原地完成的。 - zondo

2
l = [['a', 'b', 'c'], ['d', 'e', 'f']]

那么,一个简单的列表推导式就像这样:
[li[::-1] for li in l]

将为您提供所需的输出:

[['c', 'b', 'a'], ['f', 'e', 'd']]

编辑:

由于您修改了问题:

假设您现在有一个数组的数组:

import numpy as np
l2 = np.array([np.array(['a', 'b', 'c']), np.array(['d', 'e', 'f'])])

那么,您可以采取以下方式摆脱 dtypes

map(list, l2[:, ::-1])

这将为您提供:

[['c', 'b', 'a'], ['f', 'e', 'd']]

但从你的问题中仍然很难确定你想要的确切输出格式。

我试着用一个更小的列表来做这个:[['20011' '20048'] ['20011' '20048'] ['20011' '20048'] ['20011' '20048']],得到了类似于:array(['20048', '20011'], dtype='|S5'), array(['20048', '20011'], dtype='|S5'), array(['20048', '20011'], dtype='|S5'), array(['20048', '20011'], dtype='|S5')]。为什么要显示 dtype? - minks
@minks,你有NumPy数组而不是Python列表。 - Padraic Cunningham
你确定你在使用列表而不是numpy数组吗? - Cleb
哦,对了!我能否以同样的方式执行相同的过程,但是去掉数据类型呢?虽然通过反转20048和20011似乎部分起作用。 - minks
1
@cleb:它完美地运行了。谢谢。我已经接受了答案。 :) - minks
显示剩余4条评论

0

另一种列表推导方法

作为列表推导的忠实粉丝,我采用了与Cleb类似的方法,但使用了列表类的反向方法,而不是list_name[::-1]的方法。

l1 = [[1, 2, 3], [4, 5, 6], [7, 8, 9, 10]]
[l1[i].reverse() for i in range(len(l1))]

返回...

[[3, 2, 1], [6, 5, 4], [10, 9, 8, 7]]

关键是不要将推导式设置为任何值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接