如何解决类型错误:人口必须是序列或集合对于字典,使用 list(d)
我将两个文本文件导入为:
first_names = set(map(str.strip,open('first_names.all.txt')))
last_names = set(map(str.strip,open('last_names.all.txt')))
这些只是 1 列文本文件,如下所示:
--------------------
a'isha
a'ishah
a-jay
aa'isha
aa'ishah
aaban
打印类型:
print(type(first_names))
print(type(last_names))
<class 'set'>
<class 'set'>
然后我尝试创建一个包含 5,000 个名字、姓氏的笛卡尔积的样本
random.sample(itertools.product(first_names,last_names),5000)
但我收到错误:
TypeError: Population must be a sequence or set. For dicts,use list(d).
解决方法
sample
不能在大多数迭代器对象上工作——它需要一个序列或一个集合。但是将 product
变成一个列表或一个集合会占用大量内存。或者,由于您已经读取了两个 set
的名称,请在每个集合上分别使用 choice
5,000 次而不是使用 product
:
names = [(random.choice(first_names),random.choice(last_names)) for _ in range(5000)]
注意:这可能存在重复对的缺陷,而 product
不会发生这种情况。
克服这个问题的一种方法是将样本添加到一个集合中,该集合将处理重复项,并继续添加直到达到所需的数量:
names = set()
while len(names) != 5000:
names.add(tuple(random.sample(first_names,k=1) + random.sample(last_names,k=1)))
警告: Python 3.9 random.sample()
不再适用于集合:
自 3.9 版起已弃用: 将来,population 必须是一个序列。不再支持 set 的实例。套 必须首先转换为 list 或 tuple,最好在 确定性顺序,以便样本可重现。
,您不能将 random.sample 直接应用于 itertools.product 对象。 试试这个,处理一组:
p=set(itertools.product(first_names,last_names))
random.sample(p,5000)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。