大多数pythonic方式,如果所有迭代中至少有一个是可迭代的

时间:2017-04-22 18:57:54

标签: python list-comprehension iterable

说我想查看迭代中的某些对象(abc)是否在对象D中。如果Dpass中没有。如果D中至少有一个a,则b cD必须位于 if any(i in D for i in (a,b,c)): if all(i in D for i in (a,b,c)): # do something else: raise Exception ,否则会引发错误。

Archive01.rar
    MyFolder
       file01.txt
       file02.txt 
       file03.txt 
       etc.

有更多的pythonic /更少混淆的方式吗?

4 个答案:

答案 0 :(得分:2)

我会在D"中做" x每个元素只测试一次:

ins = [i in D for i in (a, b, c)]
if any(ins):
    if all(ins):
         # do something 
    else:
         raise Exception

借用phihag关于所有人与任何人之间的含义的观察:

ins = [i in D for i in (a, b, c)]
if all(ins):
    # do something
elif any(ins):
    # raise error

答案 1 :(得分:1)

你的Python代码已经是你的逻辑的几乎逐字的副本,所以我怀疑你可以简化测试。

由于all(X)对非空X暗示any(X),因此您可以对它们进行重新排序,以便它们不会嵌套:

props = (a, b, c)
if all(i in D for i in props):
    # do something
elif any(i in D for i in props):
    raise Exception('Either all or none')

请注意,我还将(a, b, c)拉出到辅助变量中,这可能会也可能不会提高清晰度,具体取决于复杂程度。

答案 2 :(得分:1)

如果abc可以播放,您可以使用集合来表达有用的方法:

elements = {a, b, c}
if not elements.isdisjoint(D):
    if elements.issubset(D):
        do_whatever():
    else:
        raise Whatever

答案 3 :(得分:1)

表达这种情况的紧凑方式可能是:

S = {a, b, c}
if set(D) & S not in (set(), S):
    raise Exception()