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)
你可能想要这样的东西:
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)
您可以使用以下某些函数itertools:
from itertools import starmap, product
x = sum(starmap(similarity, product(a, b)))
Run Code Online (Sandbox Code Playgroud)
而且正如其他人所指出的,isinstance()如果你真的需要检查,也可以通过一个类型的元组.
由于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)
| 归档时间: |
|
| 查看次数: |
1466 次 |
| 最近记录: |