Python,写入两个for循环的最佳方法

Eas*_*led 9 python for-loop coding-style

通常我知道我们可以做sum([func(x,x) for x in i]),但是我得到了一个if check和两个for循环,那么编写下面代码的最pythonic方法是什么.你可以假设相似性将返回一个数字,无论你给它什么类型.你也可以假设它真的只会得到整数和字符.

x = 0
if isinstance(a, dict) or isinstance(a, list) or isinstance(a, tuple):
    for i in a:
        for j in b:
            x += similarity (i,j)
Run Code Online (Sandbox Code Playgroud)

daw*_*awg 10

也许是这样的:

x=0
if isinstance(a,(dict,list,tuple)):
    x=sum(similarity(i,j) for i in a for j in b)
Run Code Online (Sandbox Code Playgroud)

要么:

x=(sum(similarity(i,j) for i in a for j in b) if isinstance(a,(dict,list,tuple)) 
   else 0)
Run Code Online (Sandbox Code Playgroud)

或者(假设字符串,集合或其他可迭代类型由于某种原因不会破坏您的函数):

try:
   x=sum(similarity(i,j) for i in a for j in b)
except TypeError:
   x=0
Run Code Online (Sandbox Code Playgroud)

如果您特别想要测试某些内容是否可迭代,您可以这样做:

from collections import Iterable
if isinstance(e, Iterable):
   ...
Run Code Online (Sandbox Code Playgroud)

如果您不想要某些可迭代类型,请对这些类型做出反应:

if isinstance(e, Iterable) and not isinstance(el, str):
   # an iterable that is not a string...
Run Code Online (Sandbox Code Playgroud)

  • 当你可以将所有类型传递给`isinstance`本身时,没有理由将`any`与`isinstance`一起使用. (5认同)

use*_*342 9

你可能想要这样的东西:

if isinstance(a, (dict, list, tuple)):
    x = sum(similarity(i, j) for i in a for j in b)
else:
    x = 0
Run Code Online (Sandbox Code Playgroud)


Fat*_*ror 7

您可以使用以下某些函数itertools:

from itertools import starmap, product
x = sum(starmap(similarity, product(a, b)))
Run Code Online (Sandbox Code Playgroud)

而且正如其他人所指出的,isinstance()如果你真的需要检查,也可以通过一个类型的元组.


aba*_*ert 5

由于if它不在循环内,因此在转换它时不需要在列表推导内:

x = 0
if isinstance(a, dict) or isinstance(a, list) or isinstance(a, tuple):
    x = sum([similarity(i, j) for i in a for j in b])
Run Code Online (Sandbox Code Playgroud)

同时,你真的不需要列表理解,生成器表达式将具有相同的效果,而无需构建列表:

x = 0
if isinstance(a, dict) or isinstance(a, list) or isinstance(a, tuple):
    x = sum(similarity(i, j) for i in a for j in b)
Run Code Online (Sandbox Code Playgroud)

同时,isinstance可以采取一种tuple类型来检查,所以:

x = 0
if isinstance(a, (dict, list, tuple)):
    x = sum(similarity(i, j) for i in a for j in b)
Run Code Online (Sandbox Code Playgroud)

......但实际上,我认为你不想在第一时间检查.只要a是任何可迭代的,代码就可以工作,所以...为什么我应该强制它成为那些特定类型?如果您不想要异常,只需处理异常:

try:
    x = sum(similarity(i, j) for i in a for j in b))
except TypeError:
    x = 0
Run Code Online (Sandbox Code Playgroud)