2013-03-11 24 views
-1

我遇到了一個尷尬的列表理解問題,我無法解決。所以,我有兩個列表看起來像以下:在列表的多個列表上的理解

a=[[....],[....],[....]] 
b=[[....],[....],[....]] 
len(a)==len(b) including sublists i.e sublists also have the same dimension. 

現在我想做一個re.compile它看起來像:

[re.compile(_subelement_in_a).search(_subelement_in_b).group(1)] 

,我想知道怎樣才能實現上述使用名單compherension - 是這樣的:

[[re.compile(str(x)).search(str(y)).group(1) for x in a] for y in b] 

顯然上面似乎..但沒有工作,我想知道如果有人能在正確的方向指向我。

編輯

我剛剛意識到,B的子列表比的子列表更多的元素。因此,舉例來說:

a=[[1 items],[1 items],[1 items]] 
b=[[10 item], [10 item], [10 item]] 

我還是想做到像我上面的問題:

[[re.compile(str(x)).search(str(y)).group(1) for x in b] for y in a] 

和輸出看起來像:

c = [[b[0] in a[0] items],[b[1] in a[1] items],[b[2] in a[2] items]] 

例子:

a=[["hgjkhukhkh"],["78hkugkgkug"],["ukkhukhylh"]] 
b=[[r"""a(.*?)b""",r"""c(.*?)d""",r"""e(.*?)f""",r"""g(.*?)h""",r"""i(.*?)j"""],[r"""k(.*?)l""",r"""m(.*?)n""",r"""o(.*?)p""",r"""q(.*?)r"""],[r"""s(.*?)t""",r"""u(.*?)v""",r"""x(.*?)y""",r"""z(.*?)>"""]] 

使用一對一映射。即檢查:

elements of sublists of b[0] are present in sublist element of a[0] 
elements of sublists of b[1] are present in sublist element of a[1] 
elements of sublists of b[2] are presnet in sublist element of a[2] 
+0

更改問題參數就像這樣建議您在第一時間沒有給出一個好的嘗試問題,因爲您沒有注意到問題。 – nneonneo 2013-03-11 01:46:25

+0

有沒有理由認爲你必須用列表理解來解決這個問題?您是否接受其他解決方案? – 2013-03-11 02:21:47

+0

是的,我很樂意接受任何解決方案。我只是認爲列表理解是一個很好的解決方案。 – user2152572 2013-03-11 02:38:00

回答

2

聽起來像是你在找zip?它需要一對列表並將其變爲一對列表。

[ 
    [my_operation(x,y) for x,y in zip(xs, ys)] 
    for xs, ys in zip(a, b) 
] 

- 編輯。要求已更改:

[ 
    [[regex(p, s) for p in patterns] for s in strings] 
    for strings, patterns in zip(a, b) 
] 
+0

我爲錯誤表示歉意 - 這是一個疏忽。如果有幫助,我已經包含了一個例子。 – user2152572 2013-03-11 02:02:22

+0

@ user2152572:看起來像在內部列表中,您應該使用'for x in xs for y in ys'而不是再次使用zip。像這樣嵌套fors使得列表理解涵蓋x與y的所有組合。 – hugomg 2013-03-11 02:04:44

+0

我一直在嘗試使用類似於:[[re.compile(x).search(y).group(1)for x in b] for y in a],但這不起作用。 – user2152572 2013-03-11 02:12:25

2

使用zip寬鬆:

[[re.search(x, y).group(1) for x,y in zip(s,t)] for s,t in zip(a,b)] 

第一zip(a,b)產生子列表對列表。第二個zip將元素並列在一起。

+0

我剛剛對問題進行了編輯 - b的子元素比a的子元素有更多的元素 - 想知道您的解決方案是否仍然適用。我試過了,它不適用於這種情況。 – user2152572 2013-03-11 01:38:49

+0

嗯,不,但你說這些子列表是同一維度。你已經失效了。您現在還必須指定如何將多餘的元素包裹起來(鏡像?重複?填充?)以及其他問題。你最好只填充「a」子列表。 – nneonneo 2013-03-11 01:41:20

+0

嗯..你可以通過填充一個子列表來解釋你的意思嗎?要清楚的是,在「b」中,我在每個子列表中都有一個正則表達式列表(比如說dim 100),以評估每個子列表元素「a」 - 如果這是有意義的。 – user2152572 2013-03-11 01:42:26