说我有一个Python列表,在列表中的Python
some_list = [(1,'a'),(2,'b')]
有没有一种方法,我可以缩短以下代码:
def someMethod(some_list, some_string):
for value in some_list:
if 'some_string' is value[1]:
print 'do_something'
说我有一个Python列表,在列表中的Python
some_list = [(1,'a'),(2,'b')]
有没有一种方法,我可以缩短以下代码:
def someMethod(some_list, some_string):
for value in some_list:
if 'some_string' is value[1]:
print 'do_something'
是的,你可以扁平化列表并同时检查它。
def someMethod(some_list, some_string):
some_list = [value for item in some_list for value in item if value == some_string]
for _ in some_list:
print 'do_something'
如果您正在寻找更短的长度,那么你可以做以下的(少Python化):
def someMethod(some_list, some_string):
some_list = [value for item in some_list for value in item if value == some_string]
for _ in some_list: print 'do_something'
但kartik _only_想要检查每个元组中的特定字段,而不是所有字段,因此在这里扁平化并不合适。 – 2014-09-22 05:00:56
你的元组和一个字符串列表,并且希望每次do_something()
该字符串出现在元组的第二部分。
def someMethod(some_list, some_string):
[do_something() for _, s in some_list if s == some_string]
诀窍是unpacking它的元组的第二部分进入_, s
,其中_
是throwaway variable。
不幸的是,您无法在列表理解中执行语句print 'do_something'
。但是,你可以调用打印功能,这将需要明确导入如果你正在使用Python 2:
from __future__ import print_function
def someMethod(some_list, some_string):
[print('do_something') for _, s in some_list if s == some_string]
我想这可能是更短:
def someMethod(some_list, some_string):
for value in itertools.ifilter(lambda x: x[1]=='some_string', some_list):
print 'do_something'
甚至:
def someMethod(some_list, some_string):
print '\n'.join('do_something' for x in some_list if x[1]=='some_string')
但是,尽管一些建议是短比你的代码,他们都不是更加清晰。清晰应该是你的目标,而不是简洁。
我同意清晰度比字符数更重要,但是找到itertools,lambda,join更明显的任何版本。它也会短路。 – msw 2014-09-22 04:43:34
使用any
功能:如果参数的任何元素是真实的
def someMethod(some_list, some_string):
if any(x[1] == 'some_string' for x in some_list):
print 'do_something'
的any
函数返回true。在这种情况下,参数是一个生成一系列布尔值的生成器,因此不需要检查整个列表:any
只要找到匹配值就会停止运行生成器。
这个问题中的代码示例有点难以分辨,但我怀疑Kartik想要为通过测试的'some_list'中的_each_元组“做些事情”。我假设测试应该是'x [1] == some_string'而不是'x [1] =='some_string'',但是他的代码样本有点模糊...... – 2014-09-22 05:09:55
当some_string'显然一个占位符,用正确的项目替换它是简单的,无论它是一个文字字符串还是一个变量。虽然二读时,似乎很明显,如果任何项目匹配,没有意图只做*一件*事情,所以这个答案不是解决方案。 – chepner 2014-09-22 12:10:05
*旁白*:请注意''是'几乎肯定是这个错误的操作符。改用'if'some_string'== value [1]''代替。 http://stackoverflow.com/questions/1504717/why-does-comparing-strings-in-python-using-either-or-is-sometimes-produce http://stackoverflow.com/questions/2988017/string-comparison -in-python-is-vs – 2014-09-22 03:18:42
缩短代码并保持其清晰度很困难。你为什么希望它变短? – 2014-09-22 03:20:40