2015-12-02 2 views
1

Это мой первый вопрос здесь =): Моя проблема заключается в том, что указано в названии. Я хочу просто отсортировать список кортежей с двумя элементами. Он должен работать с отсортированным, но он все равно возвращает несортированный список, ... он ничего не делает. Вход:сортировки списка кортежей не работает

#"L =[(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)]" Its an example. 
for line in stdin: 
L = [int(i) for i in line.split()] 
n = L[0] 
V = [i for i in range(n)] 
edgelist = L[1:] 
EDGE = [(edgelist[i],edgelist[i+1]) for i in range(0,len(edgelist)-1,2) ] 
mK = missingKnots(edgelist) 
EDGE = sorted(EDGE) 
EDGE = list(set(EDGE)) 

Выход:

[(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)] 

Должно быть:.!

[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)] 

Unsorted = ( Спасибо за чтение

+0

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

+0

Хорошо, спасибо! @John Bollinger – TheDude

+0

почему просто не 'L.sort()'? Я не вижу смысла в других манипуляциях. –

ответ

5

Сортировка и вернуть новый список:

>>> L =[(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)] 
>>> sorted(L) 
[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)] 

Сортировать вместо:

>>> L.sort() 
>>> L 
[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)] 

Не делайте set() позже. Наборы неупорядочены.

>>> list(set(L)) 
[(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)] # now it's messed up again. 

В идеале, для сортировки и удаления дубликатов:

>>> L = [(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5), (0, 1)] 
>>> sorted(set(L)) 
[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)] 
+0

Я знаю, что работает. Но он не работает в моем коде. – TheDude

+1

вид последний, не первый. 'Set()' закручивает ваш вид. –

+1

Вам необходимо отсортировать его после того, как вы превратили его в набор. У набора нет порядка, поэтому ваша сортировка теряется. – cmrn

1

С лямбда-выражения, вы можете настроить правила сортировки.

EDGE = [(0, 1), (4, 6), (5, 7), (0, 6), (0, 4), (2, 5)] 
EDGE = sorted(EDGE, key=lambda x: (x[0],x[1])) 
print EDGE 

результат:

[(0, 1), (0, 4), (0, 6), (2, 5), (4, 6), (5, 7)] 
+0

Nice! Это хорошо знать. – uhoh

Смежные вопросы