2017-09-14 51 views
0

持有INT迭代列表中的完整的故事的Python使從INT

我有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") 
    ] 

我想要回通過將給定元組的值與第一個元組中的值進行比較來命名tuple。

例如,

b = (1, 1) 
return [x for x in a if a.val == b] 

我面臨的問題是這種情況b = (3, 1)它應該返回第三個元組。

我試着看zip,但只有在迭代次數相同時纔有效。 我也看過itertools.product,但爲此我需要將所有元素都可迭代。

短期問題

我想看看是否有一種方法來遍歷元素在內部的元組,並使其iterables的元組。

東西如下:

a = ([3, 4], 1) 
b = [[x] for x in a] 
c = product(*b) 

這樣做的問題是,[3, 4]變得[[3, 4]]。這隻會導致一個產品。

我試圖避免每個int a list非編程式。

+1

那麼,爲什麼要把' ([3,4],1)'元組匹配?這裏有什麼規則?它應該匹配,因爲第一個元素*包含*'3'?這聽起來像是遞歸問題。 –

+0

這個列表意味着任何給定的值都應該匹配,所以'(3,1)'應該匹配,以及'(4,1)'。這是在表格中輸入值的簡寫符號。 –

+0

@TsviM,應該'b =(30,6)'匹配'X((範圍(25,30),4),「d」)'? – RomanPerekhrest

回答

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