簡體   English   中英

Python,混淆列表中的字母

[英]Python, obfuscating letters in a list

我創建了一個列表characters = list(original.lower())來列出四個字母單詞的輸入。 這會將輸入分解為單獨的字符並使它們全部變為小寫。

在以下函數中,我需要調用每個分隔的字母,並用5個set ascii字符中的1個替換它們! %*#@

我已將列表創建到一個名為var的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))

編輯:

def obfuscate_letters(word):

    import random
    new_word = ''
    for char in word:
        if random.random() < 0.9:
            new_word += random.choice(['!', '%', '&', '#', '@'])
        else:
            new_word += char
    letters = new_word
    print (letters)

def recompose_obfuscated_letters(letters):

        obfuscated = ''.join(letters)
        return obfuscated

這是我的最后兩個函數,我無法獲取返回的letters變量:

這是對dddd的響應:

!@%!
Original: dddd 
Obfuscated: dddd

亂碼的最上面一行是我需要在混淆部分旁邊去的內容; /

您可以制作一個字典,將字母映射到混淆的字符

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)
'#%*#'

在編碼函數中,第三行創建以下形式的字典

{'s': '*',
 't': '#',
 'e': '%'}

由於我在zip列表之前先對列表進行混洗,因此地圖將隨機配對。 請參閱以下幾個測試電話

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

如果您不需要重新創建后者。 這是一線解決方案。

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

外植體:

[... for ... in ...]是一個列表解析,它使用random.choice()生成一個隨機字符列表,然后使用``.join()將所有生成的字符連接到一個字符中串。


編輯:

如果“單詞”是用戶輸入(四個字母的單詞)怎么辦?

user_input = raw_input("Enter a 4-letter word:  ")
if len(user_input) == 4:
    print obfuscate(user_input)

有沒有一種方法可以使單詞中的字母有10%的機會被單獨保留而不被更改?

為此,列表理解將不起作用(據我所知),但是您仍然可以在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%

如果您想按原樣使用代碼:

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
Obfuscated: d!!%

這是我的整個代碼,您可以在代碼摘錄中按原樣使用。

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模塊中的random shuffle功能。 shuffle更改列表中項目的位置,以便當我按funny順序訪問術語時,實際上實際上是隨機訪問它們...

下一期,我使用set()在輸入單詞中找到唯一字符,然后構造從真實字符到有趣字符的映射。

當然,最后一步是遍歷原始列表,並使用我們在上面定義的兩行映射來逐一更改其所有項目。

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

一個新的答案,因為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]

(是的,默認參數是可變的,並且在每次調用時都會更改)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM