Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在m迭代中使用n对n实现if-else_Python - Fatal编程技术网

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']