Я пытаюсь получить отсортированный основной список из меньших списков. Это может быть в 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-го перерыва между Миссисипи и Луизианой.
Каков ваш ожидаемый результат в python?
@Mike отредактировал вопрос выше.
@Ananta Вы ищете решение в R
или python
@akrun не имеет значения, у меня есть обертка для обоих в моем bash
, и я пытаюсь использовать одну.
Являются ли символы только «a», «b», «c», ..., «z»?
Почему заказ e, b, d, a
на основе порядка других списков. Таким образом, каждый элемент должен видеть фланговые элементы.
извините, я не улавливаю логику
@Ananta Символы только «a», «b», «c», ..., «z»?
@LeandroHernándezMira Нет, они могут быть кем угодно. и их буквенно-цифровая сортировка не имеет значения.
@akrun, Ананта имеет в виду, что, например, первый список заказывает e
и a
, второй список заказывает e
, b
и d
, а третий заказывает b
, d
и a
.
Смотрите верхнюю часть моего обновленного ответа!
Аааи фактический ответ: 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
. Без правила определения ничьих невозможен ни один алгоритм.
Пожалуйста, посмотрите мое редактирование, я думаю, что запутал всех вас, предположив, что я пытаюсь получить список, отсортированный по алфавиту.
Спасибо за обновленный ответ. Если бы было 1000 списков, в которых охвачен каждый сценарий, то есть l3
на самом деле b,d,a
; было бы возможно?
«Если бы было 1000 списков, в которых охвачен каждый сценарий ...» Не совсем так. Можно как написано. Однако это проблема транзитивной логики. Как и в Прологе, вы могли бы сказать «собаки едят кошек», «кошки едят мышей», «x ест y ест z => x ест z», и пусть Пролог скажет вам, что «собаки едят мышей». (Обратите внимание, что это не синтаксис Пролога, если только вам не повезет.) Суть в том, что один ответ, который Пролог может дать вам, заключается в том, что он не может определить, например, «мыши едят птиц», если это не факт, определяемый фактами. что вы ввели.
Большое спасибо, кажется, мне действительно нужны графики. Спасибо, что помогли мне исследовать и заставили меня понять, что это сложнее, чем я думал. :)
Для Питона:
# 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']
Пожалуйста, посмотрите мое редактирование, я думаю, что запутал всех вас, предположив, что я пытаюсь получить список, отсортированный по алфавиту.
Спасибо за помощь. Но, кажется, чего-то не хватает, и, возможно, я смогу изменить это, как я понимаю вашу логику. В моем тесте я получил ['e', 'b', 'a', 'd']
, что неверно только с l3
, а для штатов я получил то же, что и у вас, но с Невадой и Калифорнией, только с s1
Мое решение имеет сложность На). Другие решения могут иметь 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)
Отлично, большое спасибо.
Вам нужно обернуть
sort(m)