我已经将我的数据组织成3个列表。第一个简单地包含浮点数,其中一些是重复的。第二个和第三个列表包含长度可变的1D数组
第一个列表被排序,所有列表包含相同数量的元素
总体格式如下:
a = [1.0, 1.5, 1.5, 2 , 2]
b = [arr([1 2 3 4 10]), arr([4 8 10 11 5 6 12]), arr([1 5 7]), arr([70 1 2]), arr([1])]
c = [arr([3 4 8]), arr([5 6 12]), arr([6 7 10 123 14]), arr([70 1 2]), arr([1 5 10 4])]
我试图找到一种方法来合并列表b
和c
中的数组,如果它们对应的浮点数在列表a
中相同。对于上述示例,预期结果将是:
a = [1.0, 1.5, 2]
b = [arr([1 2 3 4 10]), arr([4 8 10 11 5 6 12 1 5 7]), arr([70 1 2 1])]
c = [arr([3 4 8]), arr([5 6 12 6 7 10 123 14]), arr([70 1 2 1 5 10 4]])]
我该怎么做呢?这和拉链有关吗
编辑:以上来自@Austin和@Mad Physician的解决方案更好,所以最好使用它们。我的工作是重新发明自行车,这不是Python式的方式
我认为修改原始数组是危险的,尽管这种方法使用了两倍的内存,但以这种方式进行迭代和操作是安全的。 发生了什么:
a
上迭代,并在a(我们 通过remove(i)
排除当前值b
和c
a1
,b1
和c1
。阻塞值,这样重复的值就不会触发另一个 合并。在开始时使用if可以检查值是否被阻止np.where
,但我没有使用np数组,因为它比使用列表理解快一点。请随意编辑数据格式等,我的数据格式非常简单,便于演示由于} ,由
a
已排序,您可以在列表中的索引范围上使用^{a
键控:group
是一个迭代器,因此需要使用它来获得它所表示的实际索引。每个group
包含与list_a
中相同值对应的所有索引slice(...)
是在索引表达式中有:
时传递给list.__getitem__
的内容index
相当于group[0]:group[-1] + 1]
。这将切掉列表中与list_a
中的每个键对应的部分最后,
np.concatenate
只是将数组批量合并在一起如果您想在不执行
list(group)
的情况下执行此操作,那么可以通过其他方式使用迭代器,而不必保留值。例如,您可以让groupby
为您做这件事:在这一点上,您甚至不需要真正使用
groupby
,因为自己跟踪每件事不会有太多的工作:由于
a
已排序,因此我将使用itertools.groupby
。与@MadPhysicast的答案类似,但在zip
列表上迭代:…输出
res_a
、res_b
和res_c
为:或者,如果
a
未排序,您可以使用defaultdict
:相关问题 更多 >
编程相关推荐