Python 如何在m迭代中使用n对n实现if-else
我迭代了一系列字典:Python 如何在m迭代中使用n对n实现if-else,python,Python,我迭代了一系列字典: dictList=[{1:'One'}, {2:'Two'), {1:'One',7:'Seven'}] result=[eachDict.get(1) for eachDict in dictList if eachDict.get(1)] 检查是否显示字典键1。如果1键不在字典中,我希望它返回键7(而不是1键)。 再次,如果有键1返回它。如果没有1键,请尝试返回7键。如何做到这一点 老实说,我认为在循环中这样做更容易。没有理由总是试图将所有内容都合并到列表中。有时fo
dictList=[{1:'One'}, {2:'Two'), {1:'One',7:'Seven'}]
result=[eachDict.get(1) for eachDict in dictList if eachDict.get(1)]
检查是否显示字典键1
。如果1
键不在字典中,我希望它返回键7
(而不是1
键)。
再次,如果有键
1
返回它。如果没有1
键,请尝试返回7
键。如何做到这一点 老实说,我认为在循环中这样做更容易。没有理由总是试图将所有内容都合并到列表中。有时for循环更易于编写、读取、理解和扩展
dictlist = [{1: 'One'}, {2: 'Two'}, {1: 'One', 7: 'Seven'}]
result = []
for d in dictlist:
if 1 in d:
result.append(d[1])
elif 7 in d:
result.append(d[7])
# else:
# Possibly do something here?
如果效率很重要,那么需要一些时间
def my_func():
result = []
for d in dictlist:
if 1 in d:
result.append(d[1])
elif 7 in d:
result.append(d[7])
else:
result.append(None) # To match their implementations
%timeit my_func() # My answer
# 1000000 loops, best of 3: 646 ns per loop
%timeit [d.get(1) if 1 in d else d.get(7) for d in dictList] # Hamatti's answer
# 1000000 loops, best of 3: 808 ns per loop
%timeit [d.get(1, d.get(7)) for d in dictList] # Peter DeGlopper's answer
# 1000000 loops, best of 3: 1.07 us per loop
但是请记住,这些计时是在提供的d
上完成的。我不知道所有这些是如何扩展到更大的词典的,也不知道你在用什么样的规模。如果它不是非常大,那么效率就根本不重要了。您可以做如下操作
>> dictList=[{1:'One'}, {2:'Two'}, {7:'Seven'}]
>> [d.get(1) if 1 in d else d.get(7) for d in dictList]
['One', None, 'Seven']
Roger Fan的回答很好,但这里有一个替代方法,使用嵌套的
get
s,以防您真的想简洁一些:
result = [d.get(1, d.get(7)) for d in dictList]
这将查找这两个值,因为Python总是计算其所有函数调用的参数-get
不会短路。因此,它的效率略低于迭代方法。我认为Hamatti的答案是相同的,每次做两次关键查找(一次在中检查,一次在
中获取,无论选择哪个),但这些都不会有性能问题
对于缺少两个键的DICT,满足不添加None
的要求的一种方法是这样的丑陋:
result = [x for x in (d.get(1, d.get(7)) for d in dictList) if x]
它使用内部生成器对象,因此不会遍历两次。但是在这一点上,我肯定会使用一个
for
循环。对于要查找的几个元素,请继续使用其他解决方案,但是如果您有更多的键,if/elif/else的长列表并不好,因此您可以创建一个自定义getter,返回第一个可用的元素:
def firstgetter(*items):
def getter(dic):
for item in items:
if item in dic:
return dic[item]
return getter
实例
你必须提供几个例子来澄清问题。至少对我来说…如果没有7或1会怎么样?太棒了!谢谢你@Sputnix实际上可能并不比列表理解慢。总的来说,列表理解的速度和循环差不多,从我测试的结果来看,列表理解的速度高达30%faster@Sputnix,您的列表中没有添加任何值。谢谢您的测试。看起来只有在你保持简短的时候列表才会快速!如果“一个都不酷”,那么对于缺少两个键的dict,您希望发生什么?只是列表中没有添加任何内容,因此Hamatti答案中的示例应该是
['One','Seven']
?我认为,如果在理解中完成,比在for循环中完成更难阅读。
dictList=[{1: 'One'}, {2: 'Two'}, {2: 'Two', 7: 'Seven'}]
map(firstgetter(1, 7), dictList) # ['One', None, 'Seven']