2014-09-22 29 views
0
一个元组的值进行比较

说我有一个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' 
+2

*旁白*:请注意''是'几乎肯定是这个错误的操作符。改用'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

+2

缩短代码并保持其清晰度很困难。你为什么希望它变短? – 2014-09-22 03:20:40

回答

0

是的,你可以扁平化列表并同时检查它。

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' 
+0

但kartik _only_想要检查每个元组中的特定字段,而不是所有字段,因此在这里扁平化并不合适。 – 2014-09-22 05:00:56

-1

你的元组和一个字符串列表,并且希望每次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] 
+2

如果您不关心结果列表,请不要使用列表理解来替换for-loop。 – chepner 2014-09-22 04:01:31

+0

为什么在你只需要其中一个元组时解开元组的所有字段? – 2014-09-22 05:02:24

+0

@chepner为什么不呢? – sjy 2014-09-22 05:44:22

0

我想这可能是更短:

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

但是,尽管一些建议是比你的代码,他们都不是更加清晰。清晰应该是你的目标,而不是简洁。

+1

我同意清晰度比字符数更重要,但是找到itertools,lambda,join更明显的任何版本。它也会短路。 – msw 2014-09-22 04:43:34

1

使用any功能:如果参数的任何元素是真实的

def someMethod(some_list, some_string): 
    if any(x[1] == 'some_string' for x in some_list): 
     print 'do_something' 

any函数返回true。在这种情况下,参数是一个生成一系列布尔值的生成器,因此不需要检查整个列表:any只要找到匹配值就会停止运行生成器。

+0

这个问题中的代码示例有点难以分辨,但我怀疑Kartik想要为通过测试的'some_list'中的_each_元组“做些事情”。我假设测试应该是'x [1] == some_string'而不是'x [1] =='some_string'',但是他的代码样本有点模糊...... – 2014-09-22 05:09:55

+0

当some_string'显然一个占位符,用正确的项目替换它是简单的,无论它是一个文字字符串还是一个变量。虽然二读时,似乎很明显,如果任何项目匹配,没有意图只做*一件*事情,所以这个答案不是解决方案。 – chepner 2014-09-22 12:10:05