基于算法或模式重新排序python列表

时间:2010-10-19 18:41:54

标签: python algorithm list math

这是你在那里数学极客的傻瓜。

我有一个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 个答案:

答案 0 :(得分:5)

生成包含损坏位置的列表,然后查看索引以查找新位置。

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 :(得分:1)

我不太清楚你的意思,但是要显示实际的列表,并将其转换为包含右边值的列表:

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然后对这些对进行排序,这意味着它们按照对的第一个元素的顺序放置,这是原始索引。

答案 2 :(得分:0)

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, ...]

Neater one liner for index

>>>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, ...]