我是编程的初学者,我正在试图找出列表方法的工作原理。为了运动目的,我写了一个小字符串加扰器和解码器。
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方法在空列表中添加一些项可能会导致此问题。但我无法弄明白为什么。
答案 0 :(得分:2)
请注意,您的许多功能根本不是必需的。
var postsRef = ref.child("Posts");
var newPostRef = postsRef.push();
var postID = newPostRef.key();
postsRef.child(postID).set({
branch: data.branch})
值得注意的是,您的方法存在问题,例如:
>>> 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]
N.B。这将删除您首先尝试学习的每个列表方法!您应该注意到这一点,因为它表明列表方法很慢(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)
和append
除外),如果另一个同等可读,您应该避免使用它们解决方案存在。
答案 1 :(得分:-1)
我认为最好不要使用list
作为decoded
的数据结构。
我使用dict
作为临时变量,这是我的string_decoder版本:
_decoded = dict() # changed
def string_decoder():
x = 0
for item in keyholder:
_decoded[keyholder[x]] = scrambled[x] #changed
x += 1
return [value for key, value in sorted(_decoded.items())] #changed
decoded = string_decoder()
顺便说一下,您遇到list.insert()
的问题,因为您将列表中的值插入到不存在的位置,例如将第4项添加到2个元素的列表中。
行为示例:
>>> decoded = []
>>> decoded.insert(100, 'b')
>>['b']
>>> decoded.insert(99, 'a')
>>> decoded
['b', 'a'] # according to your code, you expect ['a', 'b'] because 99 is less than 100, but the list has not enough entries. So, the item is just appended to the end