2010-10-19 63 views
0

这里是你的数学怪杰的一个原因。基于算法或模式对python列表重新排序

我有一个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.我希望有所帮助。

+2

你能用单词解释所需的映射吗?我无法从你发布的内容中弄清楚。例如,“** 2 **”应该代表什么?数据在哪里填充0? – 2010-10-19 18:49:39

+0

@High:rhs上的值是以字典顺序表示数字1..43的字符串。假设'** 2 **'的意思是'2',星星只是某种强调。 – 2010-10-19 19:00:54

+0

对不起,** 2 **是一个错字...它应该只是2. – andyashton 2010-10-19 19:01:18

回答

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

'brokenmap = sorted(xrange(len(brokenlist)),key = brokenlist .__ getitem __)' – jfs 2010-10-19 19:42:49

+0

非常感谢,像一个魅力。 – andyashton 2010-10-19 20:01:40

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

整洁一个衬里为索引

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

这就是它首先产生的原因。问题是寻找解决方案来解决这个问题。 – 2010-10-19 18:52:21

+0

不知道我是否在正确的轨道上,但它很有趣尝试 – Dantalion 2010-10-19 19:19:10

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