这是你在那里数学极客的傻瓜。
我有一个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.我希望有所帮助。
答案 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, ...]