如何在列表中获得相同的行索引?

时间:2019-01-17 07:19:43

标签: python numpy duplicates

我有一个像这样的numpy数组:

[[0 1 0]
 [1 2 1]
 [2 2 1]
 [3 0 0]
 [4 0 1]
 [5 1 2]
 [6 0 1]
 [7 1 0]
 [8 1 2]]

第一列是索引,其他两列是位置x,y。

我想获取具有相同x,y位置的索引列表。

例如,对于上面的输入,输出可以像每行中的一组索引:

groups = [[0,7],
          [1,2],
          [4,6],
          [5,8],
          [3]]

因此,每一行代表一组具有相同位置x,y的索引。 5个组,其中4个组具有2个成员,而请注意,最后一行仅显示索引3。该组只有一个索引,即3。

我如何在python中实现呢?

4 个答案:

答案 0 :(得分:1)

检查一下:

lis = [[0 ,1, 0],
 [1, 2, 1],
 [2, 2, 1],
 [3, 0, 0],
 [4, 0, 1],
 [5, 1, 2],
 [6, 0, 1],
 [7, 1, 0],
 [8, 1, 2]]

dic = {}

for x,y,z in lis:
    if dic.get((y,z)):
        dic[(y,z)].append(x)
    else:
        dic[(y, z)] = [x]
final_list = [dic[key] for key in dic.keys()]

print(final_list)

答案 1 :(得分:1)

您似乎想要按操作分组的功能。最好的选择是将其转换为熊猫数据框,然后进行分组。

import pandas as pd

a = [[0, 1, 0], [1, 2, 1], [2, 2, 1], 
     [3, 0, 0], [4, 0, 1], [5, 1, 2], 
     [6, 0, 1], [7, 1, 0], [8, 1, 2]]

df = pd.DataFrame(a, columns =['index', 'x', 'y'])
grouped_df = df.groupby(['x', 'y']).aggregate(lambda x: tuple(x)).reset_index()

print(grouped_df)

输出:

   x  y   index
0  0  0    (3,)
1  0  1  (4, 6)
2  1  0  (0, 7)
3  1  2  (5, 8)
4  2  1  (1, 2)

答案 2 :(得分:1)

使用collections.defaultdict的其他选项:

l = [[0, 1, 0],
 [1, 2, 1],
 [2, 2, 1],
 [3, 0, 0],
 [4, 0, 1],
 [5, 1, 2],
 [6, 0, 1],
 [7, 1, 0],
 [8, 1, 2]]

s = [(l1[0], l1[1:]) for l1 in l]
s = [[x for x, y in s if y == b] for a, b in s]
s = [y for x, y in enumerate(s) if y not in s[:x]]
print(s)

然后您可以致电

[[0, 7], [1, 2], [3], [4, 6], [5, 8]]

答案 3 :(得分:0)

以最简单的方式,不使用任何程序包;

UIScrollViewDelegate.scrollViewDidEndScrollingAnimation

输出

func scrollViewDidEndScrollingAnimation(_ scrollView: UIScrollView) {
    if scrollView.contentSize.height > lastContentHeight {
        self.tableView.scrollToBottom()
        self.lastContentHeight = scrollView.contentSize.height
    }
}