完整故事
我有一个namedtuples列表,它本身包含一个元组和一个字符串,如下所示:
a = [
X(( 1, 1), "a"),
X(( 2, 1), "b"),
X(( [3, 4], 1), "c"),
X((range(25, 30), 4), "d")
X(( 13, [6, 14]), "e")
]
我想通过将给定元组的值与第一个元组中的值进行比较来返回namedtuple。
EG。
b = (1, 1)
return [x for x in a if a.val == b]
我面临的问题是案例b = (3, 1)
它应该返回第三个元组。
我试着查看zip
,但这只有在迭代的长度相同的情况下才有效。
我也看了itertools.product
,但为此我需要让所有元素都可以迭代。
简短的问题
我试图看看是否有办法迭代内部元组中的元素并使其成为迭代元组。
如下:
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
问题在于[3, 4]
变为[[3, 4]]
。然后只产生一种产品。
我试图避免让每个int
成为list
非编程。
答案 0 :(得分:1)
使用map()
,any()
和itertools.product()
函数的简短解决方案:
import collections, itertools
X = collections.namedtuple('X', ['value', 'char'])
a = [
X((1, 1), "a"),
X((2, 1), "b"),
X(([3, 4], 1), "c"),
X((range(25, 30), 4), "d"),
X((13, [6, 14]), "e")
]
f = lambda o: (o,) if not isinstance(o, collections.abc.Iterable) else o
b = (26, 4) # searched tuple
result = [x for x in a if any(i == b for i in itertools.product(*map(f, x.value)))]
print(result)
输出:
[X(value=(range(25, 30), 4), char='d')]
答案 1 :(得分:0)
我设法按如下方式解决:
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
循环c
返回(3, 1)
和(4, 1)
。
所以我的完整代码如下:
from itertools import product
def find_matching(requested):
return [found for found in list_of_tuples if requested in product(
*([val] if type(val) is int else val for val in found.val))]