Python生成一个可从int保存int的列表
完整故事 我有一个namedtuple列表,它本身包含一个tuple和一个字符串,如下所示:Python生成一个可从int保存int的列表,python,iterable,Python,Iterable,完整故事 我有一个namedtuple列表,它本身包含一个tuple和一个字符串,如下所示: 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")
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")
]
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
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))]
我想通过比较给定元组的值和第一个元组中的值来返回namedtuple
例如
我面临的问题是,caseb=(3,1)
应该返回第三个元组
我试着查看了zip
,但这只有在iterables的长度相同时才有效。
我还研究了itertools.product
,但为此,我需要所有元素都是可移植的
简短问题
我想看看是否有一种方法可以迭代内部元组中的元素,并使其成为一个iterables元组
具体如下:
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")
]
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
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))]
问题是[3,4]
变成了[[3,4]]
。这样就只能生产一种产品
我试图避免将每一个
int
都变成一个列表
非编程方式。我设法解决了这个问题,如下所示:
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")
]
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
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))]
在c
上循环返回(3,1)
和(4,1)
因此,我的完整代码如下:
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")
]
a = ([3, 4], 1)
b = [[x] for x in a]
c = product(*b)
a = ([3, 4], 1)
b = ([x] if type(x) is int else x for x in a)
c = product(*b)
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))]
使用
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')]
那么为什么要匹配
([3,4],1)
元组呢?这里有什么规定?由于第一个元素包含3
,是否应该匹配?这听起来像是一个递归问题。该列表意味着任何给定值都应该匹配,因此(3,1)
应该匹配,以及(4,1)
。这是在表中输入值的简写符号。@TsviM应该b=(30,6)
匹配X((范围(25,30),4),“d”)
?