找到/返回符合特定标准的第一个列表项的最优雅和有效的方法是什么?
例如,如果我有一个对象列表,我想得到属性的第一个对象obj.val==5.我当然可以使用列表理解,但这会产生O(n),如果n很大,那就太浪费了.break一旦达到标准,我也可以使用循环,但我认为可能有更多的pythonic /优雅解决方案.
我有一个如下的生成器函数:
def myfunct():
...
yield result
Run Code Online (Sandbox Code Playgroud)
调用此函数的常用方法是:
for r in myfunct():
dostuff(r)
Run Code Online (Sandbox Code Playgroud)
我的问题是,有什么方法可以随时从发电机中获取一个元素吗?例如,我想做类似的事情:
while True:
...
if something:
my_element = pick_just_one_element(myfunct())
dostuff(my_element)
...
Run Code Online (Sandbox Code Playgroud) 我想要一种惯用的方法来查找列表中与谓词匹配的第一个元素.
目前的代码非常难看:
[x for x in seq if predicate(x)][0]
Run Code Online (Sandbox Code Playgroud)
我想过把它改成:
from itertools import dropwhile
dropwhile(lambda x: not predicate(x), seq).next()
Run Code Online (Sandbox Code Playgroud)
但是必须有一些更优雅的东西...... None如果没有找到匹配,如果它返回一个值而不是引发异常会很好.
我知道我可以定义一个函数:
def get_first(predicate, seq):
for i in seq:
if predicate(i): return i
return None
Run Code Online (Sandbox Code Playgroud)
但是开始使用像这样的实用程序函数来填充代码是非常无味的(并且人们可能不会注意到它们已经存在,所以如果存在已经提供相同的内置函数,它们往往会随着时间的推移而重复).
我有一个dicts列表:
b = [{u'TOT_PTS_Misc': u'Utley, Alex', u'Total_Points': 96.0},
{u'TOT_PTS_Misc': u'Russo, Brandon', u'Total_Points': 96.0},
{u'TOT_PTS_Misc': u'Chappell, Justin', u'Total_Points': 96.0},
{u'TOT_PTS_Misc': u'Foster, Toney', u'Total_Points': 80.0},
{u'TOT_PTS_Misc': u'Lawson, Roman', u'Total_Points': 80.0},
{u'TOT_PTS_Misc': u'Lempke, Sam', u'Total_Points': 80.0},
{u'TOT_PTS_Misc': u'Gnezda, Alex', u'Total_Points': 78.0},
{u'TOT_PTS_Misc': u'Kirks, Damien', u'Total_Points': 78.0},
{u'TOT_PTS_Misc': u'Worden, Tom', u'Total_Points': 78.0},
{u'TOT_PTS_Misc': u'Korecz, Mike', u'Total_Points': 78.0},
{u'TOT_PTS_Misc': u'Swartz, Brian', u'Total_Points': 66.0},
{u'TOT_PTS_Misc': u'Burgess, Randy', u'Total_Points': 66.0},
{u'TOT_PTS_Misc': u'Smugala, Ryan', u'Total_Points': 66.0},
{u'TOT_PTS_Misc': u'Harmon, Gary', u'Total_Points': 66.0},
{u'TOT_PTS_Misc': u'Blasinsky, Scott', u'Total_Points': 60.0},
{u'TOT_PTS_Misc': u'Carter …Run Code Online (Sandbox Code Playgroud) 在列表中找到大于x的第一个索引的最Pythonic方法是什么?
例如,用
list = [0.5, 0.3, 0.9, 0.8]
Run Code Online (Sandbox Code Playgroud)
功能
f(list, 0.7)
Run Code Online (Sandbox Code Playgroud)
会回来的
2.
Run Code Online (Sandbox Code Playgroud) 我开始习惯于在Python中列出理解,但我担心我使用它有些不正确.我已经遇到了几次使用列表理解但是立即从生成的列表中获取第一个(也是唯一的)项目的场景.这是一个例子:
actor = [actor for actor in self.actors if actor.name==actorName][0]
Run Code Online (Sandbox Code Playgroud)
(self.actors包含一个对象列表,我试图找到一个具有特定(字符串)名称的名称,该名称位于actorName中.)
我正在尝试从列表中提取与我正在寻找的参数匹配的对象.这种方法不合理吗?晃来晃去[0]让我觉得有点不安全.
该list.index(x)函数返回值为的第一个项的列表中的索引x.
是否有一个函数,list_func_index()类似于index()具有函数的函数f(),作为参数.该函数在列表的f()每个元素上运行e,直到 f(e)返回True.然后list_func_index()返回索引e.
Codewise:
>>> def list_func_index(lst, func):
for i in range(len(lst)):
if func(lst[i]):
return i
raise ValueError('no element making func True')
>>> l = [8,10,4,5,7]
>>> def is_odd(x): return x % 2 != 0
>>> list_func_index(l,is_odd)
3
Run Code Online (Sandbox Code Playgroud)
有更优雅的解决方案吗?(以及该功能的更好名称)
我有这样的清单
myList = [0.0 , 0.0, 0.0, 2.0, 2.0]
Run Code Online (Sandbox Code Playgroud)
我想找到列表中第一个数字的位置,该位置不等于零.
myList.index(2.0)
Run Code Online (Sandbox Code Playgroud)
适用于此示例,但有时第一个非零数字将为1或3.
有这么快的方法吗?
如何在满足特定标准的序列中找到对象?
列表理解和过滤器遍历整个列表.是手工制作的唯一选择吗?
mylist = [10, 2, 20, 5, 50]
find(mylist, lambda x:x>10) # Returns 20
Run Code Online (Sandbox Code Playgroud) 我正在寻找一种优雅(简短!)的方式来返回匹配某个标准的列表的第一个元素,而不必评估列表中每个元素的条件.最终我提出了:
(e for e in mylist if my_criteria(e)).next()
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法呢?
更确切地说:有内置的python函数,如- all()和any()- 也不是有意义first()吗?出于某种原因,我不喜欢next()我的解决方案中的电话.