通过组合first names和last names数组中的值来创建唯一的名称

2024-10-04 05:34:56 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个数组,我想通过组合这两个数组来创建一个名称。 但是,不应该有重复

除了查找名称结果值数组的递归方法之外,我是否可以像返回随机名称一样返回随机名称

最简单的方法是将随机生成的名称存储在一个列表中,并在每次创建新名称时查找该列表,如下所示

import random
first_name = ['tony', 'adam', 'agustin', 'branden','stan']
last_name = ['smith', 'stark',  'wlliams']

full_name_dup_list = []

def generate_full_name():
    full_name =random.choice(first_name) +" "+ random.choice(last_name)
    if full_name in full_name_dup_list:
        generate_full_name()
    else:
        full_name_dup_list.append(full_name)
        print(full_name)



generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()

result: 
tony stark                                                                                                                                                                                             
tony wlliams                                                                                                                                                                                           
branden stark                                                                                                                                                                                          
branden smith                                                                                                                                                                                          
adam stark                                                                                                                                                                                             
agustin stark                                                                                                                                                                                          
agustin smith                                                                                                                                                                                          
stan smith      

每个结果都是不重复的全名

但是,我不想使用检查已经创建的数组的方法。 因为数组的大小会增加,返回值的数量也会增加,所以在不幸的情况下,函数可能会继续递归执行

下面是另一个计划: 比如说两种深度的陈述

import random
first_name = ['tony', 'adam', 'agustin', 'branden','stan']
last_name = ['smith', 'stark',  'wlliams']

class Index():
    idx_first = 0 
    idx_last = 0 


def generate_full_name():
    full_name=first_name[Index.idx_first] + " " + last_name[Index.idx_last]
    print(full_name)
    Index.idx_last=Index.idx_last+1
    if Index.idx_last== len(last_name)-1:
        Index.idx_first=Index.idx_first+1
        Index.idx_last=0

generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()
generate_full_name()

result: 
tony smith                                                                                                                                                                                             
tony stark                                                                                                                                                                                             
adam smith                                                                                                                                                                                             
adam stark                                                                                                                                                                                             
agustin smith                                                                                                                                                                                          
agustin stark                                                                                                                                                                                          
branden smith                                                                                                                                                                                          

但这似乎不是随机的

问:我能否创建一个函数来输出一个全名列表,比如random,而不是检查现有的全名数组


Tags: name名称indexrandom数组generatefullfirst
3条回答

要做到这一点,最简单的方法是使用哈希表:每个字符串都使用一个易于恢复的哈希代码进行索引。Python很容易做到这一点:将名称放入set,然后检查生成的新名称是否已经在集合中。做出新的选择,直到你得到一个你还没有用过的

full_name_dup_set = set()

def generate_full_name():

    full_name = random.choice(first_name) + " " + \
                random.choice(last_name)

    while full_name in full_name_dup_set:
        full_name = random.choice(first_name) + " " + \
                    random.choice(last_name)

    full_name_dup_set.add(full_name)
    print(full_name)

你知道有多少个名字是可能的——只有len(first) * len(last)。您可以在此范围内生成一个随机样本,然后做一点数学运算,将这些组合与生成的数字相匹配。对于范围内的给定整数,映射为:

f = first_name[s // len(last_name)]
l = last_name[s % len(last_name)]

在中,您可以使用random.sample,然后构建名称:

import random

first_name = ['tony', 'adam', 'agustin', 'branden','stan']
last_name = ['smith', 'stark',  'wlliams']

total = len(first_name) * len(last_name)
sam = random.sample(range(total), 10)

[f'{first_name[s // len(last_name)]} {last_name[s % len(last_name)]}' for s in sam]

结果:

['adam stark',
 'branden smith',
 'agustin smith',
 'stan wlliams',
 'tony smith',
 'stan stark',
 'branden wlliams',
 'agustin stark',
 'stan smith',
 'tony wlliams']

random.sample()如果您试图获取的数量超过您想要的总数,则会抛出一个错误,因为您需要重复

一种选择是拥有一组副本,并使用生成器:

import random

first_name = ['tony', 'adam', 'agustin', 'branden','stan']
last_name = ['smith', 'stark',  'wlliams']

def generate_random_names(first, last):
    duplicates = set()
    while True:
        f = random.choice(first)
        l = random.choice(last)
        if (f, l) in duplicates:
            continue
        duplicates.add((f, l))
        yield f, l

for i, (f, l) in zip(range(1, 11), generate_random_names(first_name, last_name)):
    print('{}. {} {}'.format(i, f, l))

印刷品:

1. stan wlliams
2. adam wlliams
3. tony wlliams
4. adam stark
5. tony stark
6. branden wlliams
7. stan stark
8. agustin smith
9. branden stark
10. agustin wlliams

另一个版本使用itertools.productrandom.sample

import random
from itertools import product

first_name = ['tony', 'adam', 'agustin', 'branden','stan']
last_name = ['smith', 'stark',  'wlliams']

print(random.sample([*product(first_name, last_name)], 10))

印刷品:

[('stan', 'wlliams'), ('tony', 'stark'), ('agustin', 'smith'), ('agustin', 'wlliams'), ('tony', 'smith'), ('tony', 'wlliams'), ('stan', 'stark'), ('branden', 'stark'), ('stan', 'smith'), ('branden', 'wlliams')]

相关问题 更多 >