Изменение порядка списка питонов на основе алгоритма или шаблона - PullRequest
0 голосов
/ 19 октября 2010

Вот тупик для вас, математики, гики.

У меня есть список Python, который представляет собой последовательность, которая выглядит следующим образом:

myList=[1,2,3,4,5,6,7,8,9,10,11,12,13,(...etc...),43]

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

1==1
2==10
3==11
4==12
5==13
6==14
7==15
8==16
9==17
10==18
11==19
12==2
13==20
14==21
etc. until
34==4
35==40
36==41
37==42
38==43
39==5
40==6
41==7
42==8
43==9

Есть ли способ, которым я могу переназначить этот список на основе шаблона, описанного выше. Имейте в виду, что список, который я ожидаю, может варьироваться от 10 до 90 пунктов.

Спасибо.

изменить для уточнения:

Список получен из файла XML со списком узлов в следующем порядке:

<page>1</page>
<page>2</page>
etc...

Процесс, который создал XML, использовал некоторые входные данные, которые ДОЛЖНЫ быть дополнены нулями, но не были. Поэтому в результате то, что указано в XML-файле как 2, следует интерпретировать как 10. Надеюсь, это поможет.

Ответы [ 3 ]

5 голосов
/ 19 октября 2010

Создайте список, который содержит пробитую позицию, затем посмотрите на индексы, чтобы найти новую позицию.

brokenlist = sorted(range(1, 44), key=str)
brokenmap = [x[0] for x in sorted(enumerate(sorted(range(1, 44), key=str)), key=lambda x: x[1])]
fixedlist = [brokenlist[x] for x in brokenmap]
1 голос
/ 19 октября 2010

Я не совсем уверен, что вы имеете в виду, но взять фактический показанный список и преобразовать его в список, содержащий значения справа:

sorted(myList, key=str)

Чтобы отменить эту операцию, независимо отфактические данные в списке:

>>> myList = ["one", "ten", "two", "three", "four", "five", "six", "seven", "eight", "nine"]
>>> fixlist = sorted(range(1,1+len(myList)), key=str)
>>> [p[1] for p in sorted(zip(fixlist,myList))]
['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten']

По существу, fixlist был переупорядочен так же, как ваши данные.Таким образом, он содержит исходный индекс каждого элемента, прежде чем они были скремблированы.zip связывает каждый элемент из списка с его исходным индексом.sorted затем сортирует пары, что означает, что они расположены в порядке первого элемента пары, который является исходным индексом.

0 голосов
/ 19 октября 2010

Python 'понимание списка' будет хорошо работать здесь. Похоже, вы хотите сортировать строки, а не числа. Так ..

seq = [str(i) for i in mylist]

>>>print sorted(seq)

['1', '10', '11', '12', '13', '2', '3', '4', '5', '6', '7', '8', '9', ...]

Если вы имели в виду числа (целые числа) вместо исходных строк, то -

seq = [int(i) for i in mylist]

>>>print sorted(seq)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13,...]

Или, если вы намеревались найти индекс для исходных предметов, чтобы они были обработаны, были в числовом порядке:

>>>print [seq.index(str(i)) for i in sorted([int(i) for i in seq])]
[0, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, ...]

аккуратнее один вкладыш для индекса

>>>print [seq.index(str(i)) for i in sorted(seq, key=int)]
    [0, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, ...]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...