匹配两个嵌套列表的顺序

时间:2017-10-04 13:18:28

标签: python python-2.7

我有两个嵌套列表:

list_a = [[[1, 2], [3, 4], [5, 6]], [[1, 2], [3, 4], [5, 6]]]

list_b = [[[5, 6], [1, 2] [3, 4]], [[5, 6], [3, 4], [1, 2]]]

我想重新排序list_b,以便每个嵌套列表的顺序,即[[5,6],[1,2],[3,4]]匹配list_a中的内容:

list_b = [[[1, 2], [3, 4], [5, 6]], [[1, 2], [3, 4], [5, 6]]]

实际上,这些列表中填充了数千个浮点数据而不是整数,并且每个包含25个嵌入列表而不是3,但它们的形状始终相同。我想要的顺序(list_a)总是相同的,list_b总是以相同的方式洗牌。

我如何得到我需要的东西?到目前为止,我已经完成了排序功能,并且我已经尝试使用索引来获取我需要的东西,因为我知道索引是什么以及它们应该是什么。但我无法解决如何设计一个处理每个嵌套列表循环的密钥。

非常感谢任何帮助!

添加上下文:

每个阵列都保存了试验x电极x数据点形状的EEG数据。我想减去两个这样的数组来得到它们之间的差异数组,但首先我必须确保"电极"排队。我得到的输出显示了电极的顺序'在每个阵列中都不一样,所以错误的电极相互减去。

我首先想弄清楚如何在一个小例子中获得每个电极的索引列表,如下所示:

chan_order = ['Fp1', 'Fp2', 'F3', 'F7', 'F4', 'F8']
wanted_order = ['Fp1', 'Fp2', 'F3', 'F4', 'F7', 'F8']
new_indices = [chan_order.index(x) for x in wanted_order]

然后我使用sort来应用这种方法:

new_order = sorted(chan_order, key=lambda x: wanted_order.index(x))

这让我得到了我想要的简化示例,但我不知道如何在实际数据时应用它:

[[[1.02, 2.22, .90, 2.50...], [2.05, 1.11, 2.34, .80...], [1.02, 2.22, .90, 2.50...]]]

此处的每个浮点数是给定时间点的幅度值,因此值会波动很多。每个浮点列表代表来自单个电极的记录。列表列表代表试验,其中有许多试验。所以在上面的例子中,我们可以想象

[1.02, 2.22, .90, 2.50]

来自电极' Fp1'其余的是' Fp2'和' F3'。问题在于其中一个阵列总是具有“Fp1”,“Fp2”,“F3”和“F3”等顺序,而第二个阵列则是混乱的。 Fp1,F3,Fp2。此信息存储在单独的1D通道名称列表中,因此我知道每个阵列的通道顺序。

2 个答案:

答案 0 :(得分:1)

在你的玩具模型中,我可以简单地做到

for i in list_b:
    i.sort()

然后从:

list_b = [[[5, 6], [3, 4], [1, 2]], [[3, 4], [1, 2], [5, 6]]]

为:

[[[1, 2], [3, 4], [5, 6]], [[1, 2], [3, 4], [5, 6]]]
>>> list_a == list_b
True

我怀疑这并不容易,而且这种方法可能会因你的花车而破裂。

答案 1 :(得分:1)

根据您的评论,让我们说订单总是固定的,因此您需要以编程方式重新排序嵌套列表的每个元素。

这里有一些参考和玩具数据:

order ['D','A','B','C'] desired_order ['A','B','C','D']

data = [[1.4,2.9,0.5,1.1],[2.2,1.8,7,0.01]]

定义一个函数,该函数将对列表列表进行爬网并重新排序/返回嵌套列表的每个元素。你甚至可以将它与你的" new_order"上面的方法去除"硬编码"功能的元素。

def reorder(lst): ret = [] for i in lst: ord = [i[1],i[2],i[3],i[0]] #this needs to change depending upon the actual order ret.append(ord) return ret

d2 = reorder(data)

d2 [[2.9, 0.5, 1.1, 1.4], [1.8, 7, 0.01, 2.2]]