2013-12-02 1 views
3

Я пытаюсь сортировать столбцы вложенного списка так:Сортировка столбцов в Python 3.3 вложенный список по частичному сравнению

lst = [["1", "2", "3", "4"], 
     ["some text 1", "some text 2", "some text 3", "some text 4"], 
     ["some text", "some text to analyze with RZstring", "some RZ-text to analyze", "some text to analyze with no rz-string and no textRZ"]] 

в соответствии с наличием случае чувствительного префикса «Rz» в струнах 3- й вложен список (тех, с RZ должен быть внизу):

lst = [["1", "4", "2", "3"], 
     ["some text 1", "some text 4", "some text 2", "some text 3"], 
     ["some text", "some text to analyze with no rz-string and no textRZ", "some text to analyze with RZstring", "some RZ-text to analyze"]] 

Я чувствую, что должен быть какой-то приятный и простой способ с itemgetter или lambda -функции, но не видят очевидного решения.

ответ

2

Вы, кажется, смешиваете две проблемы здесь. Сначала сортировка вложенного списка подобна, а вторая - сортировка по этим RZ вещам.

Вы можете сделать первое, перенести многомерный массив первым, чтобы элементы, принадлежащие друг другу, фактически находились в одном и том же подсписке. И тогда вы можете просто сортировать в соответствии со своей функцией сортировки в элементе 3-го списка.

>>> list(zip(*sorted(zip(*lst), key=lambda x: x[2]))) 
[('3', '1', '2', '4'), ('some text 3', 'some text 1', 'some text 2', 'some text 4'), ('some RZ-text to analyze', 'some text', 'some text to analyze with RZstring', 'some text to analyze with no rz-string and no textRZ')] 

Для вашей второй проблемы, однако, я не совсем понимаю, на чем основана эта сортировка. Если это был префикс до RZ, то последние два пункта по-прежнему будут отменены или нет?


на основе обновленной спецификации в комментариях, вы можете использовать регулярное выражение для проверки, если RZ происходит с границей слова в передней части (\b) и добавить тот факт, в из-за ключ сортировки:

>>> import re 
>>> list(zip(*sorted(zip(*lst), key=lambda x: (re.search(r'\bRZ', x[2]) != None, x[2])))) 
[('1', '4', '3', '2'), ('some text 1', 'some text 4', 'some text 3', 'some text 2'), ('some text', 'some text to analyze with no rz-string and no textRZ', 'some RZ-text to analyze', 'some text to analyze with RZstring')] 
+0

Те столбцы с «RZ» в качестве префикса, по крайней мере, одно слово (не 'rz', или 'Rz', или 'somethingRZsomething') должны быть внизу списка. Порядок нижних столбцов (с префиксом RZ) не имеет особого значения –

+0

Спасибо. Оба комментария были полезны, но, к сожалению, я могу отметить только одно как решение. –

+0

@ user3058525 Хотя вы можете принять только один ответ, вы все равно можете найти полезные ответы, чтобы выразить свою признательность. – poke

0

Я хотел бы начать путем преобразования три списка в один список из трех наборов:

newList = zip(*lst) 

Это даст вам:

[("1", "some text", "some text"), ...] 

Вам нужно будет определить функцию сортировки, чтобы закодировать свои RZ правила, но тогда легко сортировать:

def sortFunc(item): 
    # example, not sure what you need 
    return item[2].lower().count("rz") 

sorted(newList, key=sortFunc) 
+0

Спасибо. Мое окончательное решение было похоже на «list (map (zip (* sorted (zip (* lst), key = lambda x: 'RZ' в x [2]))))' –

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

  • Нет связанных вопросов^_^