面试题:如何用单个for循环从可变长度列表生成指定字典?
问题分析与解答
首先得明确:你要的字典根本不存在
Python里的字典不允许重复键,你列的那个目标字典{1: 1, 1: 2, 1: 3, ...}在Python里是不可能实现的——只要键重复,后面的值会直接覆盖前面的,最终只会得到{1:3, 2:3, 3:3}。这是字典的天生特性,和用不用循环没关系。
假设面试官是要生成两两组合的键值对集合(而非字典)
如果面试官的真实需求是把列表里的元素两两配对(比如(1,1)、(1,2)这种所有组合),那确实可以不用写两个嵌套for循环,用Python内置的itertools.product就能搞定,而且支持任意长度的列表:
import itertools a = [1,2,3] # 生成所有两两组合的元组列表,效果和嵌套for循环一样 result = list(itertools.product(a, a)) # 输出:[(1,1), (1,2), (1,3), (2,1), (2,2), (2,3), (3,1), (3,2), (3,3)]
要是非得用字典形式存(但得接受键唯一的规则),可以把每个键对应的值改成列表,把所有匹配的元素装进去:
import itertools from collections import defaultdict a = [1,2,3] result_dict = defaultdict(list) for k, v in itertools.product(a, a): result_dict[k].append(v) # 输出:{1: [1,2,3], 2: [1,2,3], 3: [1,2,3]}
这里用itertools.product替代了手写嵌套for循环,完全符合“不能用两个for循环”的要求,而且不管a多长都能用。
结论:面试官的问题确实有问题
你怀疑面试官出错是对的:
- 要求生成的重复键字典本身就违反Python的基础规则,根本做不到;
- 如果是要生成两两组合的集合,那用
itertools.product能满足非双循环的要求,但面试官的表述明显错了。
内容的提问来源于stack exchange,提问作者Kalyan Kumar
相关产品推荐
相关产品推荐

