Python 如何返回多维二维列表中的重复项?

Python 如何返回多维二维列表中的重复项?,python,python-3.x,list,multidimensional-array,Python,Python 3.x,List,Multidimensional Array,我有一个多维二维列表。基本上我想创建一个每行都有重复项的变量,然后我想创建另一个每行都没有重复项的变量。这可以通过使用列表来完成吗 df = [[[2, 3, 3, 3, 7, 8, 9, 9],[3, 3, 3, 5, 9, 9, 10, 11],[3, 3, 3, 4, 9, 9, 13, 15]], [[2, 3, 3, 3, 4, 4, 5, 6],[4, 4, 5, 7, 7, 7, 8, 10],[4, 4, 6, 7, 7, 7, 9, 11],[3, 3, 3, 4,

我有一个多维二维列表。基本上我想创建一个每行都有重复项的变量,然后我想创建另一个每行都没有重复项的变量。这可以通过使用列表来完成吗

df = [[[2, 3, 3, 3, 7, 8, 9, 9],[3, 3, 3, 5, 9, 9, 10, 11],[3, 3, 3, 4, 9, 9, 13, 15]],
      [[2, 3, 3, 3, 4, 4, 5, 6],[4, 4, 5, 7, 7, 7, 8, 10],[4, 4, 6, 7, 7, 7, 9, 11],[3, 3, 3, 4, 4, 8, 11, 12]],
      [[4, 6, 7, 7, 7, 9, 11, 11],[3, 3, 3, 5, 9, 10, 11, 11],[3, 3, 3, 6, 7, 7, 7, 10, 12, 12]]]
我希望我的结果是:

Dup=[[3,9]、[3,9]、[3,9]、[[3,4]、[4,7]、[4,7]、[3,4]、[7,11]、[3,11]、[3,7,12]]


notin=[[27,8]、[5,10,11]、[4,13,15]、[2,5,6]、[5,8,10]、[6,9,11]、[8,11,12]、[4,6,9]、[5,9,10]、[6,10]]]
这可以使用列表理解和
集合来实现。计数器如下所示:

dup = [[[i for i, c in Counter(sl).items() if c>1] for sl in l] for l in df]
not_in = [[[i for i, c in Counter(sl).items() if c==1] for sl in l] for l in df]
#duplicates
[[[3, 9], [3, 9], [3, 9]], [[3, 4], [4, 7], [4, 7], [3, 4]], [[7, 11], [3, 11], [3, 7, 12]]]
#uniques
[[[2, 7, 8], [5, 10, 11], [4, 13, 15]], [[2, 5, 6], [5, 8, 10],[6, 9, 11], [8, 11, 12]], [[4, 6, 9], [5, 9, 10], [6, 10]]]
仅供参考,我使用了
l
sl
相应的列表和子列表。
I
代表项目,
c
sl
中该项目的计数。结果如下:

dup = [[[i for i, c in Counter(sl).items() if c>1] for sl in l] for l in df]
not_in = [[[i for i, c in Counter(sl).items() if c==1] for sl in l] for l in df]
#duplicates
[[[3, 9], [3, 9], [3, 9]], [[3, 4], [4, 7], [4, 7], [3, 4]], [[7, 11], [3, 11], [3, 7, 12]]]
#uniques
[[[2, 7, 8], [5, 10, 11], [4, 13, 15]], [[2, 5, 6], [5, 8, 10],[6, 9, 11], [8, 11, 12]], [[4, 6, 9], [5, 9, 10], [6, 10]]]

无需额外导入,只需使用双嵌套列表理解、
set
count

>>> [[[x for x in set(ll) if ll.count(x) > 1] for ll in l] for l in df]
[[[3, 9], [3, 9], [3, 9]],
 [[3, 4], [4, 7], [4, 7], [3, 4]],
 [[7, 11], [3, 11], [3, 7, 12]]]

>>> [[[x for x in set(ll) if ll.count(x) == 1] for ll in l] for l in df]
[[[2, 7, 8], [5, 10, 11], [4, 13, 15]],
 [[2, 5, 6], [5, 8, 10], [6, 9, 11], [8, 11, 12]],
 [[4, 6, 9], [5, 9, 10], [6, 10]]]

不过,请注意,如果最里面的列表非常大,那么使用可能会更快;否则就没关系了,这个版本可能是最直接、最容易阅读的版本。

df
是一个3D列表…?实际上对我很有用。我必须重新复制哦,我明白了,
df
是一个2D列表。这似乎是你可以做的事情使用
numpy
。您正在将列表列表展平为列表列表。您是对的,这比我想都没有想到的要快。回答得好。@Jab-Hm,如果列表非常大,我不认为这会更快,因为这会有O(n²)的复杂性(n是最里面列表的平均长度),而您的应该是O(n)。但是创建
计数器可能会有一些开销,这会使许多短列表的速度变慢。我指的是OPs案例,但yes同意。
Dup = [[list(dict.fromkeys([el for i, el in zip(range(len(l)), l) if el in l[:i]+l[i+1:]])) for l in ll] for ll in df]
Not_in = [[[el for i, el in zip(range(len(l)), l) if el not in l[:i]+l[i+1:]] for l in ll] for ll in df]