删除非常大的单词列表中的重复单词

Deleting duplicated words in a very large words list

我是这方面的初学者,我编写了一个程序,可以按照特定算法生成单词表。问题是它会重复。

所以我正在寻找一种方法,使代码在给定的范围或给定的单词数中迭代,而不重复单词。

或者编写另一个程序,遍历第一个程序创建的单词列表,并删除该文件中的所有重复单词,这需要时间但值得。

应该生成的单词应该是这样的X4K7GB9y,长度为8个字符,遵循规则 [A-Z][0-9][A-Z][0-9][A-Z][A-Z][0-9][a-z],代码是这样的:

import random
import string

random.seed(0)
NUM_WORDS = 100000000

with open("wordlist.txt", "w", encoding="utf-8") as ofile:     
    for _ in range(NUM_WORDS): 
        uppc = random.sample(string.ascii_uppercase, k=4)
        lowc = random.sample(string.ascii_lowercase, k=1) 
        digi = random.sample(string.digits, k=3) 
        word = uppc[0] + digi[0] + uppc[1] + digi[1] + uppc[2] + uppc[3] + digi[2] + lowc[0] 
        print(word, file=ofile)

如果您可以修改代码使其不重复或编写另一个代码来检查单词表中的重复项并将其删除,我将不胜感激。提前谢谢你

鉴于您的算法创建了一个单词列表(唯一与否)。 您可以使用 set 只保留唯一的单词,请看下面的示例。

word_list = ["word1", "word2", "word3", "word1"]
unique_words = set(word_list)

returns unique_words 列表仅包含 ["word1", "word2", "word3"]。

您可以通过记住您创建的内容而不是再次编写来防止重复的单词。

这需要一点内存来容纳 100.000.000 个 8 个字母的单词 - 您可以通过只记住单词的哈希值来减少它。你会错过一些散列冲突,但大约 26**5 * 10**3 = 11,881,376,000 可能的组合你应该没问题。

import random
import string

random.seed(0)
NUM_WORDS = 100 # reduced for testing purposes
found = 0
words = set()
with open("wordlist.txt", "w", encoding="utf-8") as ofile:     
    while found < NUM_WORDS: 
        # get 5 upper case letters, use the 5h as .lower()
        l = random.sample(string.ascii_uppercase, k=5) 
        d = random.sample(string.digits, k=3) 
        word = l[0] + d[0] + l[1] + d[1] + l[2] + l[3] + d[2] + l[4].lower()
        if hash(word) in words:
            continue
        print(word, file=ofile)
        words.add(hash(word))
        found += 1

这是一个可能的解决方案,使用 set() 删除重复的单词列表:

import random
import string

random.seed(0)
words_count = 100_000_000
words = set()

while len(words) < words_count:
    u = random.sample(string.ascii_uppercase, k=4)
    l = random.sample(string.ascii_lowercase, k=1)
    d = random.sample(string.digits, k=3)
    words.add(f'{u[0]}{d[0]}{u[1]}{d[1]}{u[2]}{u[3]}{d[2]}{l[0]}')

with open('wordlist.txt', 'w', encoding='utf-8') as f: 
    print(*words, file=f, sep='\n')

请记住,生成一亿个随机词需要大量内存和很长时间。

下面的程序将根据条件生成唯一值,并将其写入文本文件。

这组代码创建了唯一值

import random
import string 

 n = 100
 l = []
    
for i in range(n):
    word = chr(random.randint(65, 90)) + str(random.randint(1, 9)) + chr(random.randint(65, 90)) + str(random.randint(1, 9)) + chr(random.randint(65, 90))+ chr(random.randint(65, 90)) + str(random.randint(1, 9)) + chr(random.randint(65, 90)).lower()
    l.append(word)
finallist = list(set(l))

下面的代码会将结果写入文件。

with open("Uniquewords.txt", "w") as f:
    for i in finallist:
        f.write(i)
        f.write("\n")
    f.close()