0

我对 Python 比较陌生,所以我想问这个问题:

由数字0~9组成的长度为10000的序列,

目标:在10个不同的位置随机插入10个数字序列(已经知道它们的编号),并记录插入前的位置。

所以,函数将是:

def insertion( insertion_sequence_list, long_sequence ):
    #modifying the long sequence
    return inserted_long_sequence and inserted_positions

我该怎么做?我面临的问题是,每当我在随机位置插入 1 时,后面的位置都会改变:

例如:

我有 123456789123456789 作为长序列

当我将“999”插入第二个位置(129993456789123456789)时。但是后来,当我想在第三个位置插入一个序列“888”时,我希望它是原始位置,我希望它是-- 129993* 888 *456789123456789。但实际上它将是 129* 888 *993456789123456789 。我不知道它如何解决这个问题。

请让我知道是否有任何重复的可能性,我什至不知道这个问题属于什么:\

感谢所有评论、观点和回答!

4

3 回答 3

2

因为只有后面的位置会改变,如果你收集你的插入操作,对它们进行排序,然后先插入最新的,那么一切都会起作用。

insertion_ops = [(position, insertion) for ...]
for position, insertion in reversed(sorted(insertion_ops)):
    sequence[position:position] = insertion

或者,您可以将插入位置转换为负位置,即从末端偏移;不过,您仍然需要先对它们进行排序。

于 2012-06-22T15:55:57.887 回答
2

您可以通过按位置排序并以相反的顺序申请来做到这一点。打领带时顺序重要吗?然后只按位置排序,而不是按位置和顺序排序,这样它们就会以正确的顺序插入。例如,如果插入 999@1 然后是 888@1,如果你对这两个值进行排序,你会得到 888@1,999@1。

12345
18889992345

但是仅按位置进行排序并使用稳定排序给出 999@1,888@1

12345
1999888345

这是代码:

import random
import operator

# Easier to use a mutable list than an immutable string for insertion.
sequence = list('123456789123456789')
insertions = '999 888 777 666 555 444 333 222 111'.split()
locations = [random.randrange(len(sequence)) for i in xrange(10)]
modifications = zip(locations,insertions)
print modifications
# sort them by location.
# Since Python 2.2, sorts are guaranteed to be stable,
# so if you insert 999 into 1, then 222 into 1, this will keep them
# in the right order
modifications.sort(key=operator.itemgetter(0))
print modifications
# apply in reverse order
for i,seq in reversed(modifications):
    print 'insert {} into {}'.format(seq,i)
    # Here's where using a mutable list helps
    sequence[i:i] = list(seq)
    print ''.join(sequence)

结果:

[(11, '999'), (8, '888'), (7, '777'), (15, '666'), (12, '555'), (11, '444'), (0, '333'), (0, '222'), (15, '111')]
[(0, '333'), (0, '222'), (7, '777'), (8, '888'), (11, '999'), (11, '444'), (12, '555'), (15, '666'), (15, '111')]
insert 111 into 15
123456789123456111789
insert 666 into 15
123456789123456666111789
insert 555 into 12
123456789123555456666111789
insert 444 into 11
123456789124443555456666111789
insert 999 into 11
123456789129994443555456666111789
insert 888 into 8
123456788889129994443555456666111789
insert 777 into 7
123456777788889129994443555456666111789
insert 222 into 0
222123456777788889129994443555456666111789
insert 333 into 0
333222123456777788889129994443555456666111789
于 2012-06-22T16:20:54.997 回答
1

insertion_sequence_list看起来像什么?如果是这样的话:

[('999', 2),
 ('888', 3)]

然后您应该根据第二个值按降序对其进行排序:

from operator import itemgetter

ins_seq_li.sort(key = itemgetter(1), reverse = True)

然后,当您从该列表中进行插入时,您将在最大索引 1 处添加,因此您之前的插入应该没问题。

于 2012-06-22T15:57:17.187 回答