我在Python方面相对较新,并且我想问这个问题:
数字0~9的长度为10000,
目标:在10个不同的位置随机插入10个数字序列(已经知道他们的nunbers),并在插入前记录位置。
所以,函数将是:
def insertion( insertion_sequence_list, long_sequence ):
#modifying the long sequence
return inserted_long_sequence and inserted_positions
我该怎么办?我面临的问题是每当我在随机位置插入1时,后面的位置都会改变:
例如:
我有123456789123456789作为长序列
当我将“999”插入第二个位置时(129993456789123456789)。但是后来,当我想在第3个位置插入序列“888”时,我希望它是原始位置,我希望它是 - 129993 * 888 * 456789123456789。但实际上它将是129 * 888 * 993456789123456789。我不知道如何解决这个问题。
如果有任何重复可能性,请告诉我,我甚至不知道这个问题属于什么:\
感谢所有评论,观点和答案!
答案 0 :(得分:2)
由于只有后面的位置会发生变化,如果您收集插入操作,请对它们进行排序然后插入最新位置,然后一切都会正常工作。
insertion_ops = [(position, insertion) for ...]
for position, insertion in reversed(sorted(insertion_ops)):
sequence[position:position] = insertion
或者,您可以将插入位置转换为负位置,即从末尾开始偏移;你仍然需要先对它们进行排序。
答案 1 :(得分: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
答案 2 :(得分:1)
insertion_sequence_list
看起来像什么?如果它是这样的话:
[('999', 2),
('888', 3)]
然后你应该根据第二个值按降序排序:
from operator import itemgetter
ins_seq_li.sort(key = itemgetter(1), reverse = True)
然后,当您从该列表中进行插入时,您将以最大的索引1添加,因此您之前的插入应该没问题。