Как отсортировать целые числа в списке списков, но пропуская определенный индекс каждого списка? - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть список списков с 3 целыми числами, как это:

myList = [[1,2,3],[2,4,3],[2,1,3],[3,2,4],[5,4,3],[4,3,2],[5,4,3], [3,4,2]]

Я хочу удалить список, если он имеет симметричный в myList. Например [1,2,3] и [3,2,1] симметричны, и [1,2,3] или [3,2,1] могут оставаться в новом списке, но не в обоих.

Я попытался отсортировать, чтобы избавиться от симметричных c списков

myList = [[1,2,3],[2,4,3],[2,1,3],[3,2,4],[5,4,3],[4,3,2],[5,4,3], [3,4,2]]
result = set()

for elem in myList: 
    result.add(tuple(sorted(elem)))

result = list(result)
print(result)

Код выглядел следующим образом:

[(3, 4, 5), (2, 3, 4), (1, 2, 3)]

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

Например [2, 4 , 3], [3, 2 , 4], [3, 4 , 2] должны быть отсортированы как -> [2, 4 , 3], [3, 2 , 4], [2, 4 , 3] и тогда я смогу избавиться от идентичных символов -> [2 , 4,3], [3,2,4]

Не могли бы вы предложить мне способ сортировки целых чисел в списках в myList, но пропуская среднее значение каждого списка, как показано ниже, чтобы я мог исключить симметричные списки?

Ответы [ 4 ]

0 голосов
/ 20 апреля 2020

Это должно работать:

myList = [[1,2,3],[2,4,3],[2,1,3],[3,2,4],[5,4,3],[4,3,2],[5,4,3], [3,4,2]]
result = set()
for elem in myList:
    # Check if reversed tuple is in the set 
    if tuple(reversed(elem)) not in result:
        # Add it to the set if not
        result.add(tuple(elem))

# Map the tuple set to lists of list
result = list(map(list, result))

print(result)

Дает результат:

[[2, 4, 3], [4, 3, 2], [1, 2, 3], [5, 4, 3], [3, 2, 4], [2, 1, 3]]
0 голосов
/ 20 апреля 2020
# Removes symmetry.
removed_symmetry = list(filter(lambda obj: tuple(obj) not in [tuple(x) for x in [i for i in myList if i is not obj]], myList))

# Sorts based on left and right value.
middle_unchanged_sort = [[x, y, z] if x < z else [z, y, x] for x, y, z in myList]

Не уверен, что я полностью понял, о чем вы спрашиваете, но два приведенных выше будут выполнять отдельные функции для myList.

0 голосов
/ 20 апреля 2020

То, что вы хотите - это set уникального lists из myList. См. последний заголовок раздела для сортировки, как вы просили.

Набор уникальных кортежей

При получении окончательного результата в виде набора из кортежей работает, то вы можете сделать это следующим образом.

set([tuple(sorted(e)) for e in myList])
# Or using map
set(map(lambda x: tuple(sorted(x)), myList))

Вывод :

{(1, 2, 3), (2, 3, 4), (3, 4, 5)}

Список уникальных списков

Если вам необходимо у вас есть конечный результат в виде списка уникальных списков, тогда вы можете попробовать это.

[list(ee) for ee in set([tuple(sorted(e)) for e in myList])]
# Or using map
list(map(list, set([tuple(sorted(e)) for e in myList])))

Вывод :

[[3, 4, 5], [2, 3, 4], [1, 2, 3]]

Извлечение недубликатов / неотраженных списков

Вы можете использовать библиотеку pandas для выполнения это тоже.

import numpy as np
import pandas as pd
# use pandas.DataFrame to sort by 
# first and third values in each row
df = pd.DataFrame(np.array(myList), columns=['A', 'B', 'C'])
df['D'] = df.apply(lambda row: '{}-{}-{}'.format(row.A+row.C, row.B, row.C+row.A), axis=1)

df = (df
        .sort_values(['D', 'A', 'C'], ascending=True, inplace=False)
        .drop_duplicates(subset=['D'], keep='first', inplace=False, ignore_index=False)
        .drop(columns=['D'], inplace=False)
    )
#print(df)

# make list of lists sorted by 
# first and third values in each list
# And drop the duplicates (mirrored)
[list(e) for e in df.to_numpy()]
# Or
list(map(list, df.to_numpy()))

Вывод :

[[1, 2, 3], [2, 1, 3], [2, 4, 3], [4, 3, 2], [3, 2, 4], [5, 4, 3]]

Если вы хотите получить ответ в том же порядке, что и в оригинальном myList, вы можете сделать следующее:

# after running what was done previously to df
[list(e) for e in df.sort_index().to_numpy()]
# Or
list(map(list, df.sort_index().to_numpy()))

Выход :

[[1, 2, 3], [2, 4, 3], [2, 1, 3], [3, 2, 4], [5, 4, 3], [4, 3, 2]]
0 голосов
/ 20 апреля 2020

С

[[1,2,3],[3,2,1],[3,1,2],[2,1,3],[1,3,2],[2,3,1]]

мы сохраняем

[[1,2,3],        [3,1,2],        [1,3,2]]

, поскольку средний элемент является фиксированным, а 1/3-й равны в удаленных.

Мы достигли это путем создания кортежей, состоящих из вашего среднего элемента и набора всех чисел - мы сохраняем первый из каждого, остальные мы тратим sh - все без переупорядочения исходных элементов вообще:

myList = [[1,2,3],[2,4,3],[2,1,3],[3,2,4],[5,4,3],[4,3,2],[5,4,3], [3,4,2]]

# create a set of sets to keep
mySets = set((p[1],frozenset(p)) for p in myList)

rv = []

# go through your list
for nums in myList:
    # create a set from the current item in your list
    fs = (nums[1], frozenset(nums))
    # if we want to keep it, do so
    if fs in mySets:
        rv.append(nums)
        # and remove it from the to be kept list
        mySets.remove(fs)
    # if empty, we are done
    if not mySets:
        break 
print(rv)           

Вывод :

[[1, 2, 3], [2, 4, 3], [2, 1, 3], [3, 2, 4], [5, 4, 3], [4, 3, 2]]   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...