Python,混淆列表中的字母

Python,混淆列表中的字母,python,Python,我创建了一个列表characters=list(original.lower())来列出四个字母单词的输入。这会将输入分解为单独的字符,并使其全部为小写 在下面的函数中,我需要调用分离的每个字母,并用5个ascii字符中的1个替换它们,它们是!%*#@ 我已经将列表创建到一个名为-obfuscate=[“!”、“%”、“*”、“#”、“@”]的变量中,现在需要但不知道如何引入每个字符并对输入的每个字母应用随机符号 original = input("Enter a 4-letter word:

我创建了一个列表
characters=list(original.lower())
来列出四个字母单词的输入。这会将输入分解为单独的字符,并使其全部为小写

在下面的函数中,我需要调用分离的每个字母,并用5个ascii字符中的1个替换它们,它们是!%*#@

我已经将列表创建到一个名为-
obfuscate=[“!”、“%”、“*”、“#”、“@”]
的变量中,现在需要但不知道如何引入每个字符并对输入的每个字母应用随机符号

original = input("Enter a 4-letter word:  ")

    letters = isolate_letters(original) 
    obsfucate_letters(letters) 
    obfuscated = recompose_obfuscated_letters(letters)

    print("Original:  ", original)
    print("Obfuscated:  ", obfuscated)

def isolate_letters(original):

    characters = list(original.lower())
    print (characters)
    return characters


def obsfucate_letters(original):

    import random
    obfuscate = ["!", "%", "*", "#", "@"]
    print (random.choice(obfuscate))
编辑:


最上面一行的乱码是我需要去旁边的模糊位/

您可以制作一本字典,将字母映射到其模糊字符

import random
def encode(word, symbols):
    obfuscate = list(symbols)
    random.shuffle(obfuscate)
    d = dict(zip(word, obfuscate))
    return ''.join(d[i] for i in word)

>>> obfuscate = ["!", "%", "*", "#", "@"]
>>> word = 'test'
>>> encode(word, obfuscate)
'#%*#'
在encode函数中,第三行创建以下形式的字典

{'s': '*',
 't': '#',
 'e': '%'}
因为我在对列表进行洗牌之前先洗牌,所以地图将随机配对。请参阅以下几个测试调用

>>> encode(word, obfuscate)
'%!#%'
>>> encode(word, obfuscate)
'@#%@'
>>> encode(word, obfuscate)
'@#*@'
>>> encode(word, obfuscate)
'%!*%'
>>> encode(word, obfuscate)
'@*%@'

这是我的全部代码,您可以在代码摘录中使用

from __future__ import print_function

def isolate_letters(s):
    return [c for c in s]

def obfuscate_letters(loc):
    from random import shuffle
    funny = ['!', '%', '*', '#', '@']
    # shuffle the list of funny characters
    shuffle(funny)
    # create a dictionary
    d = {c:f for f,c in zip(funny,set(loc))}
    # change in place the list of characters
    for i, c in enumerate(loc):
        loc[i] = d[c]

def recompose_obfuscated_letters(looc):
    return "".join(looc)

# here it is a copy and past from your OP (except for the spellung of obfuscate...)
original = 'funk'
letters = isolate_letters(original)
obfuscate_letters(letters)
obfuscated = recompose_obfuscated_letters(letters)

print('Original:    "%s"' % original)
print('Obfuscated:  "%s"' % obfuscated)
我的输出是

Original:    "funk"
Obfuscated:  "*#%@"
键使用
random
模块中的
shuffle
功能
shuffle
随机更改列表中项目的位置,因此,当我按顺序访问
fully
中的术语时,实际上是随机访问它们

下一期,我使用
set()
找到输入字中的唯一字符,然后构建一个从真实字符到有趣字符的映射

当然,最后一步是遍历原始列表,并使用上面两行定义的映射逐个更改其所有项


(最后一部分,修改原始列表,遵循OP如何编码她/他的示例)

如果您不需要重新创建单词“后者”。这里有一个单线解决方案

import random
def obfuscate(word):
    return ''.join([random.choice(["!", "%", "*", "#", "@"]) for char in word])
解释:

[…for…in…]是一个,它使用random.choice()生成一个随机字符列表,然后,将所有生成的字符连接到一个字符串中


编辑:

如果“单词”是用户输入的(四个字母的单词)?

user_input = raw_input("Enter a 4-letter word:  ")
if len(user_input) == 4:
    print obfuscate(user_input)
有没有一种方法可以使单词中的一个字母有10%的几率被单独留下而不被更改?

user_input = raw_input("Enter a 4-letter word:  ")
if len(user_input) == 4:
    print obfuscate(user_input)
对于这一点,列表理解将不起作用(据我所知),但您仍然可以在For循环中进行

def obsfucate(word):
    new_word = ''
    for char in word:
        if random.random() > 0.1:
            new_word += random.choice(["!", "%", "*", "#", "@"])
        else:
            new_word += char
    return new_word
输出:

Enter a 4-letter word:  Damn
D%*#

编辑2:

实际上,你可以使用列表理解

def obsfucate(word):
    return ''.join([random.choice(["!", "%", "*", "#", "@"]) if random.random() > 0.1 else char for char in word])
但对我来说,这有点乱


编辑3:

完整代码应类似于:

import random

def obfuscate(word):
    new_word = ''
    for char in word:
        if random.random() > 0.1:
            new_word += random.choice(["!", "%", "*", "#", "@"])
        else:
            new_word += char
    return new_word

user_input = raw_input("Enter a 4-letter word:  ")
if len(user_input) == 4:
    print "Original:", user_input
    print "Obfuscate:", obfuscate(user_input)
输出:

Enter a 4-letter word:  Damn
Original: Damn
Obfuscate: D@m%
Enter a 4-letter word:  Damn
Original: Damn
Obfuscated: d!!%

如果要按原样使用代码,请执行以下操作:

import random

def isolate_letters(original):
    characters = list(original.lower())
    return characters

def obsfucate(word):
    return [random.choice(["!", "%", "*", "#", "@"]) if random.random() > 0.1 else char for char in word]

def recompose_obfuscated_letters(letters):
    obfuscated = ''.join(letters)
    return obfuscated

original = input("Enter a 4-letter word:  ")

letters = isolate_letters(original)
obsfucate_letters = obsfucate(letters)
obfuscated = recompose_obfuscated_letters(obsfucate_letters)

print("Original:", original)
print("Obfuscated:", obfuscated)
输出:

Enter a 4-letter word:  Damn
Original: Damn
Obfuscate: D@m%
Enter a 4-letter word:  Damn
Original: Damn
Obfuscated: d!!%

一个新的答案,因为OP实质上有一个新的问题

def obfuscate_letters(s,funny=[c for c in "!!!%%%&&&###@@@  "]):
    from random import shuffle
    shuffle(funny)
    for i, c in enumerate(s):
        s[i] = funny[i] if funny[i] != ' ' else s[i]

(是的,默认参数是可变的,并且在每次调用时都会更改)

请提供一个代码应如何工作的示例。是否需要重新生成原始字母(或文本)?如果原始字母是
'aaba'
,则经过模糊处理的单词必须是,例如,
'@@#@'
,使用相同的有趣字符代替原始单词中相同的重复字符?使用的混淆方法是将输入转换为小写,将4个字母中的每一个分隔开,并使用以下符号之一随机替换每个字母:!%&*#@。这6个符号中的每一个都有15%的几率被选中,剩下的10%意味着字母不会被更改。随机性在哪里?@ScottHunter编辑以解决问题的随机因素。这听起来不错,但如果“单词”是用户输入的(一个四个字母的单词),该怎么办?还有一种方法可以使单词中的一个字母有10%的几率被单独留下而不被更改吗?不需要重新组合功能。因为新词已经是字符串了。而且,你不是在复述信件,而是在打印。无需创建字母变量,因为它与new_word相同。最后,您应该编辑您的问题,而不是我的答案。;)