Как получить тот же индекс строк в списке? - PullRequest
0 голосов
/ 17 января 2019

У меня есть такой массив:

[[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 голосов
/ 17 января 2019

Другой вариант с использованием collections.defaultdict:

from collections import defaultdict

res = defaultdict(list)
for x, y, z in array:
  res[(y,z)].append(x)

Тогда вы можете позвонить

print(list(res.values()))
#=> [[0, 7], [1, 2], [3], [4, 6], [5, 8]]
0 голосов
/ 17 января 2019

Кажется, вам нужна функциональность, такая как группировка по операции. Лучше всего преобразовать его в фрейм данных pandas, а затем сделать группу по.

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)
0 голосов
/ 17 января 2019

Проще всего без использования какого-либо пакета;

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]]
0 голосов
/ 17 января 2019

проверить это:

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)
...