gpt4 book ai didi

python - 在空列表上使用 .insert

转载 作者:行者123 更新时间:2023-11-28 18:31:14 26 4
gpt4 key购买 nike

我是编程初学者,我正在尝试弄清楚列表方法的工作原理。为了练习目的,我写了一个微型字符串扰频器和解码器。

import random
sliced = []
keyholder = []
scrambled = []
decoded = []

def string_slicer(string):
i = 0
while i < len(string):
sliced.append(string[i])
i += 1

def string_scrambler(string):
string = string_slicer(string)
a = 0
while len(scrambled) != len(sliced):
value = len(sliced) - 1
key = random.randint(0,value)
if key in keyholder:
continue
else:
scrambled.append(sliced[key])
keyholder.append(key)
continue

def string_decoder():
x = 0
for item in keyholder:
decoded.insert(keyholder[x], scrambled[x])
x += 1

string_scrambler('merhaba')
string_decoder()

print sliced
print keyholder
print scrambled
print decoded

当我测试它时,string_scrambler() 工作正常,但 string_decoder() 给出随机结果。以下是一些示例:

C:\Python27\Exercises>python scrambler.py
['m', 'e', 'r', 'h', 'a', 'b', 'a']
[2, 6, 0, 1, 3, 5, 4]
['r', 'a', 'm', 'e', 'h', 'b', 'a']
['m', 'e', 'r', 'h', 'a', 'a', 'b']

C:\Python27\Exercises>python scrambler.py
['m', 'e', 'r', 'h', 'a', 'b', 'a']
[4, 5, 1, 0, 3, 2, 6]
['a', 'b', 'e', 'm', 'h', 'r', 'a']
['m', 'a', 'r', 'e', 'h', 'b', 'a']

C:\Python27\Exercises>python scrambler.py
['m', 'e', 'r', 'h', 'a', 'b', 'a']
[1, 4, 5, 2, 3, 0, 6]
['e', 'a', 'b', 'r', 'h', 'm', 'a']
['m', 'e', 'a', 'r', 'h', 'b', 'a']

我认为尝试使用 .insert 方法在空列表中添加一些项目可能会导致此问题。但我想不通到底是为什么。

最佳答案

请注意,您的许多功能根本不是必需的。

>>> list("some string")
["s", "o", "m", "e", " ", "s", "t", "r", "i", "n", "g"]`
# just like your `string_slicer` function.

值得注意的是,您的方法存在问题,您可能会尝试这样做,例如:

>>> lst = []
>>> lst.insert("after", 3)
>>> lst.insert("before", 2)
>>> lst
["after", "before"]

由于列表的初始长度为零,插入结束点只会将其发送到列表的末尾。尽管 3 是比 2 更远的索引,但它没有正确排序,因为基本上你已经完成了

lst.append("after")
lst.append("before")

相反,您可以执行以下操作:

scrambled = [''] * len(sliced)
# build a list of the same length as the cleartext sliced string

for idx, dest in enumerate(keyholder):
scrambled[dest] = sliced[idx]

然后要解扰,反其道而行之

deciphered = [''] * len(scrambled)
for idx, dest in enumerate(keyholder):
deciphered[idx] = scrambled[dest]

我将使用的完整解决方案(包括一些其他技巧)是:

import random

def make_key(lst):
return random.shuffle(range(len(lst)))

def scramble(lst, key):
result = [''] * len(lst)
for idx, dst in enumerate(key):
result[dst] = lst[idx]
return result

def unscramble(scrambled, key):
return [scrambled[idx] for idx in key]

s = "merhaba"
key = make_key(list(s))

scrambled = scramble(list(s), key)
deciphered = unscramble(scrambled, key)

print(list(s))
print(key)
print(scrambled)
print(deciphered)

注意这会删除您最初尝试学习的每一个列表方法!你应该注意到这一点,因为它表明列表方法很慢(appendpop 除外),你应该避免使用它们-存在可读的解决方案。

关于python - 在空列表上使用 .insert,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37059868/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com