sel*_*tec 34 python tuples list
说我有元组列表:
list = [(1,5), (1,7), (2,3)]
Run Code Online (Sandbox Code Playgroud)
有没有办法在Python中编写类似的东西
if (1, *) in list: do things
Run Code Online (Sandbox Code Playgroud)
在哪里*意味着" 我不关心这个价值 "?所以我们检查1第一个位置是否有元组,第二个位置是否有值.
据我所知,其他语言中有特殊机制,但我不知道这个特殊问题的名称.那么Python中有类似的行为吗?
PS:我知道我可以在这里使用列表推导.我对这个特殊机制感兴趣.
Mar*_*ers 71
你可以使用这个any()功能:
if any(t[0] == 1 for t in yourlist):
Run Code Online (Sandbox Code Playgroud)
如果1在元组的第一个位置找到,这将有效地测试并提前退出.
acd*_*cdr 33
像你要求的占位符对象本身不受支持,但你可以自己制作类似的东西:
class Any(object):
def __eq__(self, other):
return True
ANYTHING = Any()
lst = [(1,5), (1,7), (2,3)]
Run Code Online (Sandbox Code Playgroud)
该__eq__方法定义了两个对象如何测试相等性.(有关详细信息,请参阅https://docs.python.org/3/reference/datamodel.html.)此处,ANYTHING始终会测试与任何对象的相等性.(除非该对象也__eq__以返回False的方式覆盖.)
该in运营商仅仅要求__eq__在您的列表中的每个元素.即a in b做以下事情:
for elem in b:
if elem == a:
return True
Run Code Online (Sandbox Code Playgroud)
这意味着,如果你说(1, ANYTHING) in lst,Python将首先与(1, ANYTHING)第一个元素进行比较lst.(反过来,元组定义__eq__为返回True,如果它的所有元素都__eq__返回True.即(x, y) == (a, b)相当于x==a and y==b,或者x.__eq__(a) and y.__eq__(b).)
因此,(1, ANYTHING) in lst将返回True,而(3, ANYTHING) in lst返回False.
另外,请注意我重命名了您的列表,lst而不是list防止与内置Python的名称冲突list.
Edd*_*oso 10
并非下面提供的所有解决方案方法都必须有效.我的目标是展示我能想到的每种可能的解决方法 - 在我的答案结束时,我提供"基准"结果,以显示为什么或为什么不应该使用某种方法而不是另一种方法.我相信这是一种很好的学习方式,我会在答案中无耻地鼓励这种学习.
sets>>> a_list = [(1,5), (1,7), (2,3)]
>>>
>>> set([l[0] for l in a_list])
{1, 2}
>>>
>>> 1 in set([l[0] for l in a_list])
True
Run Code Online (Sandbox Code Playgroud)
map()和匿名函数>>> a_list = [(1,5), (1,7), (2,3)]
>>>
>>> map(lambda x: x[0] == 1, a_list)
[True, True, False]
>>>
>>> True in set(map(lambda x: x[0] == 1, a_list))
True
Run Code Online (Sandbox Code Playgroud)
filter 和匿名函数>>> a_list = [(1,5), (1,7), (2,3)]
>>>
>>> filter(lambda x: x[0] == 1, a_list)
[(1,5), (1,7)]
>>>
>>> len(filter(lambda x: x[0] == 1, a_list)) > 0 # non-empty list
True
Run Code Online (Sandbox Code Playgroud)
from pprint import pprint
from random import randint
from timeit import timeit
N_ITEMS = 1000
N_SIM = 1 * (10 ** 5) # 100K = 100000
a_list = [(randint(0, 100), randint(0, 100)) for _ in range(N_ITEMS)]
set_membership_list_comprehension_time = timeit(
"1 in set([l[0] for l in a_list])",
number = N_SIM,
setup="from __main__ import a_list"
)
bool_membership_map_time = timeit(
"True in set(map(lambda x: x[0] == 1, a_list))",
number = N_SIM,
setup="from __main__ import a_list"
)
nonzero_length_filter_time = timeit(
"len(filter(lambda x: x[0] == 1, a_list)) > 0",
number = N_SIM,
setup="from __main__ import a_list"
)
any_list_comprehension_time = timeit(
"any(t[0] == 1 for t in a_list)",
number = N_SIM,
setup="from __main__ import a_list"
)
results = {
"any(t[0] == 1 for t in a_list)": any_list_comprehension_time,
"len(filter(lambda x: x[0] == 1, a_list)) > 0": nonzero_length_filter_time,
"True in set(map(lambda x: x[0] == 1, a_list))": bool_membership_map_time,
"1 in set([l[0] for l in a_list])": set_membership_list_comprehension_time
}
pprint(
sorted(results.items(), key = lambda x: x[1])
)
Run Code Online (Sandbox Code Playgroud)
[('any(t[0] == 1 for t in a_list)', 2.6685791015625), # winner - Martijn
('1 in set([l[0] for l in a_list])', 4.85234808921814),
('len(filter(lambda x: x[0] == 1, a_list)) > 0', 7.11224889755249),
('True in set(map(lambda x: x[0] == 1, a_list))', 10.343087911605835)]
Run Code Online (Sandbox Code Playgroud)
谁现在笑到最后?...... Martijn(至少我试过)
故事的道理:当一个小的测试数据,另一个用户的答案是事实上正确的答案时,不要花费超过10分钟"证明"你的劣质解决方案更快更有效
小智 5
这可以使用list comprehension在Python中完成.例如:
a= [(1, 2), (3, 4), (4, 5), (1, 4)]
[i for i in a if i[0] == 1]
Run Code Online (Sandbox Code Playgroud)
会给你:
[(1, 2), (1, 4)]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2829 次 |
| 最近记录: |