【问题标题】:I need to generate 1000 unique first name In Python我需要在 Python 中生成 1000 个唯一的名字
【发布时间】:2019-09-14 03:30:43
【问题描述】:

我需要生成 1000 个唯一的名字并将它们存储在一个列表中。 我正在使用 Python faker,但得到了很多重复值。

import random
from random import shuffle
from faker import Faker

fake = Faker()
fake.random.seed(4321)  

first_n=[]
for i in range(1000):
    name=fake.first_name()
    if name in first_n:
        first_n.append("Repeat")
    else:
        first_n.append(name)

感谢您的帮助。

【问题讨论】:

    标签: python


    【解决方案1】:

    不要生成随机值然后检查它们是否唯一,而是检索存储在您正在使用的提供程序中的名称列表,将它们打乱并返回前 1000 个。这样您就不会在全部。 en 提供程序中定义了大约 7k 个名字,而其他语言的名字可能要少得多 - 当您进一步进入序列时,会产生相当肯定的冲突。

    from random import shuffle, seed
    from faker.providers.person.en import Provider
    
    first_names = list(set(Provider.first_names))
    
    seed(4321)
    shuffle(first_names)
    
    print(first_names[0:1000])
    

    【讨论】:

    • 谢谢,但每次我得到不同的值。我每次运行都需要相同的值。
    • 在这种情况下,在每次调用 shuffle 之前,使用与您自己的示例相同的种子来播种随机数生成器。我已经更新了答案中的代码以使用种子。
    • 从随机导入 shuffle,种子 from faker.providers.person.en import Provider first_names = list(Provider.first_names) seed(4321) shuffle(first_names) li=(first_names[0:1000]) print(len(li)) new=[] for n in li: if n in new: new.append("repeat") else: new.append(n) print(sorted(new)) 最后得到重复值的名单。 “‘佐伊’、‘佐莉’、‘佐拉’、‘重复’、‘重复’、‘重复’、‘重复’、‘重复’]”
    • 啊,这可能是由于男性和女性名字重复造成的。您可以在将唯一名称提取为列表之前创建一个集合。我又更新了代码。
    • 我可以对 Last_name 使用相同的名称吗?
    【解决方案2】:

    您需要将数据存储在集合而不是列表中以防止重复

    然后你可以使用一个while循环

    first_n = set()
    while len(first_n) < 1000:
        first_n.add(fake.first_name())
    

    【讨论】:

    • 我收到错误..“AttributeError: 'set' object has no attribute 'append'
    • 应该添加而不是附加。但它可能很慢。
    • @Abhi 应该。如前所述,虽然会很慢
    • 是的,太慢了,还没有得到结果。还有其他选择吗??
    【解决方案3】:

    您可以使用一组,并不断添加,直到达到您想要的长度:

    names = set()
    while len(names) < LENGTH:
        names.add(NAME)
    

    然后您可以转换回列表:

    names = list(names)
    

    【讨论】:

      【解决方案4】:

      自版本4.9.0 起,python 的 Faker 库具有支持唯一值的内置功能。 请参阅relevant section of the README

      本质上,现在可以做到:

      from faker import Faker
      faker = Faker()
      names = [faker.unique.first_name() for _ in range(500)]
      assert len(set(names)) == len(names)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-03
        • 1970-01-01
        • 2014-11-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多