Функция для сортировки списка списков по группам, которые совместно используют элемент

#python #function #sorting #nested-lists #custom-lists

#python #функция #сортировка #вложенные списки #пользовательские списки

Вопрос:

Мой код предназначен для сортировки списка списков в следующих примерах.

Я хотел бы сгруппировать все [Y, x, x] друг с другом.

 C = [[1,2,3],[4,5,7],[7,8,9],[1,2,4],[4,5,6]]
  

Предполагаемый результат

Обратите внимание, что мой Y выделен жирным шрифтом

сортированный C = [[1, 2,3], [1,2,4], [4,5,7],[4,5,6],[7,8,9]]

 c = [[4,5,10],[1,2,3],[4,5,6],[1,7,9],[1,2,8],[4,5,9],[1,7,8],[4,5,12],[9,8,7]]
sc = []

def sorting():
    
    for a in range(0, len(c)):
        for b in c[a 1:]:
            # prevent duplicates
            if b not in sc:
                if c[a] not in sc:
                    if c[a][0] == b[0]:
                        sc.append(b)
                        sc.append(c[a])
    for z in c:
        if z not in sc:
            for a in range(0, len(sc)):
                if sc[a][0] == z[0]:
                    if sc.count(z) < 1:
                        # insert missing list into intended location
                        sc.insert(a, z)
    # Append lists that may have been missed (eg. [9,8,7])                    
    for zz in c:
        if sc.count(zz) < 1:
            sc.append(zz)

sorting()
print(sc)
  

Вывод ошибки

Эта функция имеет семантическую ошибку, поскольку она выводит [4, x, x] в неправильном месте. Как показано в примере, все [Y, x, x] должны быть сгруппированы вместе.

[[4, 5, 6], [4, 5, 10], [1, 7, 9], [1, 2, 3], [1, 7, 8], [1, 2, 8], [4, 5, 12], [4, 5, 9], [9, 8, 7]]

Вопрос

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

Какие ошибки я делаю, которые приводят к недопустимому выводу?

Комментарии:

1. необходима ли реализация вашего собственного алгоритма сортировки? или использование встроенного sorted будет тем, что вы ищете?

2. Вам специально запрещено использовать такие функции, как sort и sorted ? Если нет, «профессиональным» решением было бы сделать что-то вроде sc = sorted(c) . 🙂

3. Если вам требуется реализовать свою собственную логику сортировки с нуля, я бы рекомендовал провести небольшое исследование стандартных стратегий сортировки и попытаться реализовать одну из них, а не пытаться изобрести свою собственную. Сортировка выбора была бы очень похожа на то, что вы пытаетесь, но проще — выполните цикл по списку, возьмите наименьший элемент и добавьте его к результату, повторите, чтобы найти следующий наименьший элемент, повторяйте до завершения.

4. Никогда не будет перекрытия между группами? Что произойдет, если у вас есть C = [[1,2,3],[4,5,7],[7,8,9],[1,2,4],[4,5,6],[1,2,4]]. Где последняя группа имеет 1 и 4.

Ответ №1:

попробуйте использовать лямбда-функцию для функции сортировки, чтобы сортировать только по первому элементу. попробуйте это:

 c = [[4,5,10],[1,2,3],[4,5,6],[1,7,9],[1,2,8],[4,5,9],[1,7,8],[4,5,12],[9,8,7]]

a = sorted(c, key=lambda parameter: parameter[0])   # sort by first element in item
print(a)
  

вывод:

 [[1, 2, 3], [1, 7, 9], [1, 2, 8], [1, 7, 8], [4, 5, 10], [4, 5, 6], [4, 5, 9], [4, 5, 12], [9, 8, 7]]