Как составить отсортированный список элементов на основе нескольких списков отсортированных элементов?

Я пытаюсь получить отсортированный основной список из меньших списков. Это может быть в python или R.

в Р у меня есть

l1<-c("a","c","d")
l2<-c("a","b","e")
l3<-c("a","c","e")
l4<-c("a","b","c","e")
l5<-c("b","c","d")

m<-unique(c(l1,l2,l3,l4,l5))

Результат, который я ожидал, это a,b,c,d,e.

В питоне

l1=["a","c","d"]
l2=["a","b","e"]
l3=["a","c","e"]
l4=["a","b","c","e"]
l5=["b","c","d"]

ожидаемый результат ["a","b","c","d","e"] Я начал с создания набора и просмотра каждого списка и проверки с индексом, но это стало сложным.

Спасибо за помощь.

Обновлено: Я думаю, что смутил вас наличием списка, отсортированного по алфавиту. Эти элементы списка могут быть случайными. реального заказа может и не быть a,b,c,d,e.

l1=["e","a"]
l2=["e","b","d"]
l3=["b","d","a"]

в этом случае ожидаемый заказ ["e","b","d","a"] не ["a","b","d","e"]

для большей ясности подумайте о нескольких людях, пытающихся назвать штаты США с востока на запад.

person 1 says, Florida, Louisiana, Nevada,California. 
person 2 says  Alabama, Mississippi, Louisiana, new Mexico, Nevada 
person 3 says Florida, Alabama, Texas, New Mexico, California
person 4 says Alabama, Mississippi, Texas, Nevada
person 5 says Mississippi Louisiana, Nevada

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

Итак, здесь, мы начнем с Florida, Louisiana, Nevada, California. Теперь, добавляя второе, это будет (Alabama, Florida),Louisiana,New Mexico, Nevada, California. Добавление 3-го (разрывает связь Алабамы/Флориды),Florida, Alabama, Louisiana, Texas, New Mexico, Nevada, California и добавление 4-го дает Florida, Alabama, (Mississippi/Louisiana), Texas, New Mexico, Nevada, California. добавление 5-го перерыва между Миссисипи и Луизианой.

Вам нужно обернуть sort(m)

akrun 28.05.2019 23:56

Каков ваш ожидаемый результат в python?

Mike 28.05.2019 23:56

@Mike отредактировал вопрос выше.

Ananta 28.05.2019 23:58

@Ananta Вы ищете решение в R или python

akrun 28.05.2019 23:59

@akrun не имеет значения, у меня есть обертка для обоих в моем bash, и я пытаюсь использовать одну.

Ananta 29.05.2019 00:01

Являются ли символы только «a», «b», «c», ..., «z»?

Leandro Hernández Mira 29.05.2019 00:01

Почему заказ e, b, d, a

akrun 29.05.2019 00:11

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

Ananta 29.05.2019 00:12

извините, я не улавливаю логику

akrun 29.05.2019 00:14

@Ananta Символы только «a», «b», «c», ..., «z»?

Leandro Hernández Mira 29.05.2019 00:17

@LeandroHernándezMira Нет, они могут быть кем угодно. и их буквенно-цифровая сортировка не имеет значения.

Ananta 29.05.2019 00:18

@akrun, Ананта имеет в виду, что, например, первый список заказывает e и a, второй список заказывает e, b и d, а третий заказывает b, d и a.

Mike 29.05.2019 00:29

Смотрите верхнюю часть моего обновленного ответа!

Mike 29.05.2019 00:46
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
13
72
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Аааи фактический ответ: https://www.python.org/doc/essays/graphs/

Удачной охоты! :D

Это должно сделать это для вашего исходного вопроса:

l1=["a","c","d"]
l2=["a","b","e"]
l3=["a","c","e"]
l4=["a","b","c","e"]
l5=["b","c","d"]

s = set()
s.update(l1, l2, l3, l4, l5)
l = sorted(s)
l
#['a', 'b', 'c', 'd', 'e']

Для вашего отредактированного вопроса давайте рассмотрим небольшую вариацию вашего второго примера:

l1=["e","a"]
l2=["e","b","d"]
l3=["b","c","a"]

(Прищурьтесь на l3.) В этом случае набор списков недоопределен, так как нет однозначного порядка между d и c. Без правила определения ничьих невозможен ни один алгоритм.

Пожалуйста, посмотрите мое редактирование, я думаю, что запутал всех вас, предположив, что я пытаюсь получить список, отсортированный по алфавиту.

Ananta 29.05.2019 00:10

Спасибо за обновленный ответ. Если бы было 1000 списков, в которых охвачен каждый сценарий, то есть l3 на самом деле b,d,a; было бы возможно?

Ananta 29.05.2019 00:35

«Если бы было 1000 списков, в которых охвачен каждый сценарий ...» Не совсем так. Можно как написано. Однако это проблема транзитивной логики. Как и в Прологе, вы могли бы сказать «собаки едят кошек», «кошки едят мышей», «x ест y ест z => x ест z», и пусть Пролог скажет вам, что «собаки едят мышей». (Обратите внимание, что это не синтаксис Пролога, если только вам не повезет.) Суть в том, что один ответ, который Пролог может дать вам, заключается в том, что он не может определить, например, «мыши едят птиц», если это не факт, определяемый фактами. что вы ввели.

Mike 29.05.2019 00:41

Большое спасибо, кажется, мне действительно нужны графики. Спасибо, что помогли мне исследовать и заставили меня понять, что это сложнее, чем я думал. :)

Ananta 29.05.2019 00:48

Для Питона:

# Create list of lists
lsts = [l1, l2, l3, l4, l5]
s = set()

# Add lists to set
for lst in lsts:
  s.update(lst)

# Sort set
sorted(s)

Редактировать После обновления OP:

def sort_lists(lsts):
  list_of_hashes = []
  for lst in lsts:
    list_of_hashes.append({k: v for v, k in enumerate(lst)})

  result_hash = dict()
  for hash_item in list_of_hashes:
    for key, value in hash_item.items():
      if result_hash.get(key):
        result_hash[key] += value
      else:
        result_hash[key] = value
  print(result_hash)
  sorted_results = sorted(result_hash.items(), key=lambda kv: kv[1])
  print(sorted_results)
  return [tup[0] for tup in sorted_results]
# Test Case 1
l1=["e","a"]
l2=["e","b","d"]
l3=["b","d","a"]

print(sort_lists([l1,l2,l3]))
>> ['e', 'd', 'b', 'a']
# Test Case 2
s1 = ['Florida', 'Louisiana', 'Nevada', 'California']
s2 = ['Alabama', 'Mississippi', 'Louisiana', 'New Mexico', 'Nevada']
s3 = ['Florida', 'Alabama', 'Texas', 'New Mexico', 'California']
s4 = ['Alabama', 'Mississippi', 'Texas', 'Nevada']
s5 = ['Mississippi', 'Louisiana', 'Nevada']
print(sort_lists([s1,s2,s3,s4,s5]))
>> ['Florida', 'Alabama', 'Mississippi', 'Louisiana', 'Texas', 'New Mexico', 'California', 'Nevada']

Пожалуйста, посмотрите мое редактирование, я думаю, что запутал всех вас, предположив, что я пытаюсь получить список, отсортированный по алфавиту.

Ananta 29.05.2019 00:10

Спасибо за помощь. Но, кажется, чего-то не хватает, и, возможно, я смогу изменить это, как я понимаю вашу логику. В моем тесте я получил ['e', 'b', 'a', 'd'], что неверно только с l3, а для штатов я получил то же, что и у вас, но с Невадой и Калифорнией, только с s1

Ananta 29.05.2019 15:55

Мое решение имеет сложность На). Другие решения могут иметь O (n log n):

Python: (для R аналогично)

l1=["a","c","d"]
l2=["a","b","e"]
l3=["a","c","e"]
l4=["a","b","c","e"]
l5=["b","c","d"]

lsts = [l1, l2, l3, l4, l5]

solve = []
for p in range(130):
    solve.append(0)

for lst in lsts:
    for p in lst:
        solve[ord(p)] += 1

for idx, value in enumerate(solve):
    if value != 0:
        print chr(idx)

Это решение основано на значениях из таблицы ascii.

Для вашего обновления:

l1=["z","c","d"]
l2=["a","b","e"]
l3=["a","c","e"]
l4=["a","b","c","e"]
l5=["b","c","d"]

mySet = set()

mySet.update(l1, l2, l3, l4, l5)

result = sorted(mySet)
print(result)
Ответ принят как подходящий

Вот подход в R, который превращает векторы в ориентированный ациклический граф с помощью tidygraph, а затем использует node_topo_order для получения подразумеваемого порядка узлов. Используя ваш пример, с востока на запад:

l1 <- c("Florida", "Louisiana", "Nevada", "California")
l2 <- c("Alabama", "Mississippi", "Louisiana", "New Mexico", "Nevada" )
l3 <- c("Florida", "Alabama", "Texas", "New Mexico", "California")
l4 <- c("Alabama", "Mississippi", "Texas", "Nevada")
l5 <- c("Mississippi", "Louisiana", "Nevada")

library(tidyverse)
library(tidygraph)
ew_graph <- list(l1, l2, l3, l4, l5) %>%
  map_dfr(~tibble(east = ., west = lead(.))) %>% # turn vectors into edge table
  filter(!is.na(west)) %>%
  as_tbl_graph()

ew_graph %>%  # Now we can order nodes and extract their names as output
  arrange(node_topo_order()) %>%
  pull(name)
#> [1] "Florida"     "Alabama"     "Mississippi" "Louisiana"   "Texas"      
#> [6] "New Mexico"  "Nevada"      "California"

Обратите внимание, что может быть более одного правильного заказа, и это вернет только один из них. Если мы хотим, мы также можем построить график, чтобы увидеть отношения более четко, что показывает, что в этих данных у нас есть связь между Луизианой и Техасом (вы не можете проследить от одного к другому), что вы упустили при построении пример. Просто так получилось, что они у нас в «истинном» порядке. Если вам нужно определить отдельный способ разрыва связей, этот подход потребует некоторого взлома.

library(ggraph)
ggraph(ew_graph) +
  geom_node_label(aes(label = name)) +
  geom_edge_link(
    mapping = aes(start_cap = label_rect(node1.name),
                  end_cap = label_rect(node2.name)),
    arrow = arrow(length = unit(4, 'mm'))
  )

Created on 2019-05-28 by the reprex package (v0.3.0)

Отлично, большое спасибо.

Ananta 29.05.2019 16:04

Другие вопросы по теме