单词在设定位置的排列

permutations with words at set positions

提问人:Dasher Love 提问时间:2/23/2023 更新时间:2/24/2023 访问量:120

问:

我正在尝试编写一个脚本,该脚本可以创建所有单词的排列,其中一些位于设定的位置。我基本上是在尝试恢复我的 12 个单词助记词种子,其中我有几个额外的字母,但我知道一些字母的位置,例如,我知道单词 1 是野生的,单词 5 是脚本,最后一个单词是受伤的。我有 15 个单词我想尝试排列,这样我就得到了

野生 permword1 permword2 permword3 脚本 permword6 permword7 permword8 permword9 permword10 permword11 伤害

'我有python的基本知识。我只知道如何打印单词的所有排列,但是这需要更长的时间,并且还会打印一些甚至不可能打印的排列,因为其中一个排列在不同的位置有单词 5。我有我的单词列表,我只是想以一种更有效的方式恢复我的助记词种子,因为我最终创建了如此多的排列,以至于我的笔记本电脑空间不足。我不想被推荐 btcrecover,因为我有一些问题。

理想情况下,我会得到一个这样的列表,

野生 permword1 permword2 permword3 脚本 permword6 permword7 permword8 permword9 permword10 permword11 伤害

野生 permword1 permword2 permword3 脚本 permword6 permword7 permword8 permword9 permword10 permword12 伤害

野生 permword1 permword2 permword3 脚本 permword6 permword7 permword8 permword9 permword10 permword13 伤害

我提前感谢!

只是常规排列,但我不确定如何拆分这些单词,以便单词 5 始终是脚本。

排列 python-itertools 比特币 助记符

评论

2赞 Kelly Bundy 2/24/2023
如果你的“笔记本电脑空间不足”,你很可能做错了。但是很难说你什么时候不显示你的代码。
0赞 suchislife 2/24/2023
此外,您似乎已经找到了钱包中的助记词,但您还不知道单词的位置。

答:

2赞 mafe 2/24/2023 #1

发电机

我猜您的计算机耗尽“空间”的原因是您将所有创建的排列一次保存在内存中。这是 python 中生成器的完美用例。您可以将生成器视为在给定索引值的情况下创建某些值的规则,而不是一次创建所有内容。请参阅此处的示例:了解 Python 中的生成器

在排列中设置值

对于设置位置的单词,您可以为每个排列创建一个列表,然后插入预设的单词。

溶液

我认为以下代码可以解决您的问题。在最后一行中,我打印了排列,您可以将其替换为您想对每个排列执行的任何操作。

import itertools

permwords = [f"permword{ind+1}" for ind in range(0,15)]

def produce_partially_set(worlist):
    worlist.insert(0, "wild")
    worlist.insert(4, "script")
    worlist.append("hurt")
    return worlist

indices_perm = itertools.permutations(range(0,12)) # 12 unknown words in "solution"
while True:
    indices = next(indices_perm)
    permutation = [permwords[x] for x in indices]
    mneumonic_seed = produce_partially_set(permutation)
    print(mneumonic_seed)

PS:代码将抛出一个“StopIteration”,一旦它遍历了所有可能的排列。

评论

1赞 Kelly Bundy 2/24/2023
将迭代器包装在生成器中没有任何意义。这只会减慢它的速度。为什么不使用循环而不是循环呢?forwhile
0赞 mafe 2/24/2023
我不知道 itertools.permutations 可以直接使用并调整了我的答案。感谢您的见解!
1赞 Tom McLean 2/24/2023
为什么不做代替for indices in itertools.permutations(range(0, 12))while True:
0赞 mafe 2/24/2023
我以为这样生成器的本质对 OP 来说更明确、更清晰,但你是对的,那会更简洁,我想也会更快。
0赞 Dasher Love 2/25/2023
我这样做了,但它并没有遍历所有 15 个单词,脚本产生了 12 个单词的排列,就好像我只有 12 个而不是 15 个单词可以排列一样。这意味着后面的单词甚至没有包括在内。