2014-11-25 1 views
0

У меня есть назначение по логике и его отношениям, и на определенном этапе алгоритма я должен иметь возможность сортировать по алфавиту список со строками и списками строк.Сортировка по алфавиту списка со строками и списками строк в Python

Например, что-то вроде

[['not', 'D'], ['not', 'C'], 'B', 'A'] 

должен стать

['A', 'B', ['not', 'C'], ['not', 'D']] 

так, что строки единицы (предложения) получить отсортированные вместе со строками на второй элемент из списка (не Символизирует отрицание предложения и постоянное).

До сих пор я мог использовать sorted(List, key=itemgetter(0,1)), но это всего лишь трюк для этого особого случая и даже не работает, когда строки являются литералами, как пример выше. Обратите внимание, что строка может быть «B» или «Banana», последняя для которой работает мое быстрое исправление.

Я ценю вашу помощь, так как мне не удалось найти решение по всем вопросам, поставленным здесь.

EDIT:

Другим примером является то, что

[['not', 'Pours'], ['not', 'Outside'], 'Rusty', 'Rains'] 

должен стать

['Rains', 'Rusty', ['not', 'Outside'], ['not', 'Pours']] 

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

То есть,

[['not', 'Dinossaur'], ['not', 'Carriage'], 'Banana', 'Apocalypse'] 

фактически получает правильную форму с предложением любезно предоставленной @ inspectorG4dget.

ответ

1
>>> L = [['not', 'D'], ['not', 'C'], 'B', 'A'] 
>>> L.sort(key=lambda x:(isinstance(x,str) and x) or x[1]) 
>>> L 
['A', 'B', ['not', 'C'], ['not', 'D']] 

Edit:

In [30]: L = [['not', 'D'], ['not', 'C'], 'B', 'A'] 

In [31]: L.sort(key=lambda x:(not isinstance(x,str), x if isinstance(x,str) else x[1])) 

In [32]: L 
Out[32]: ['A', 'B', ['not', 'C'], ['not', 'D']] 

In [33]: L = [['not', 'Pours'], ['not', 'Outside'], 'Rusty', 'Rains'] 

In [34]: L.sort(key=lambda x:(not isinstance(x,str), x if isinstance(x,str) else x[1])) 

In [35]: L 
Out[35]: ['Rains', 'Rusty', ['not', 'Outside'], ['not', 'Pours']] 
+0

Большое вам спасибо за ваш ответ, это было очень поучительно. Тем не менее, я проверил его для случая, когда размер строки был больше 1, и списки появились до строк единицы. Я считаю, что требуется другое условие, основанное на типе, но не повреждая буквальный случай. Есть ли у вас какие-либо предложения по эффективному применению этого метода? – Alegom

+0

@Alegom: Пожалуйста, отредактируйте свое сообщение, чтобы включить пример проблемы, о которой вы упомянули, а также ожидаемый/желаемый результат. – inspectorG4dget

+0

Сообщение было обновлено! Мне удалось сделать это за два шага, но я надеялся на одну идею. – Alegom