2017-08-17 52 views
0

說我得到了這個名單名單列表,在別人列表第二個元素匹配的第一項列出

A = [['a','b'], 
    ['b','c'], 
    ['c','a'], 
    ['d','a'], 
    ['e',None]] 

什麼是最好的/有效的方式來匹配的元素,這樣就可以找出哪些列表中第一個和第二個元素之間具有匹配的列表。

預期的匹配將是:

  • 列表2和3點中的匹配0
  • 列表1個匹配列表2
  • 列表0的匹配列表1

如所看到的,可以存在更多的匹配在一個列表中,並且可以有與任何值不匹配的None值。列表中還會有其他項目,但這個例子不需要。每個列表中的第一個和第二個項目不匹配。每次比賽時我都想運行一些東西,並且需要一個簡單的方法來做到這一點。

這是否合理且可行?

+1

第一個元素是唯一的嗎?如果他們不是,應該發生什麼,例如在第一個位置出現兩行「a」? –

+0

@MartijnPieters他們是獨一無二的。忘了提到這一點。 – Thomasedv

+0

列表是否可以包含內容['a','a']? – Moberg

回答

3

創建從第一個元素到索引的映射。我假定第一元素是唯一以簡化這個例子:

indices = {t[0]: i for i, t in enumerate(A)} 

現在你可以每個元素映射平凡到與其匹配的索引:

for index, (first, second) in enumerate(A): 
    if second in indices: 
     print(f'Row {index} matches row {indices[second]}') 

演示:

>>> A = [['a','b'], 
...  ['b','c'], 
...  ['c','a'], 
...  ['d','a'], 
...  ['e',None]] 
>>> indices = {t[0]: i for i, t in enumerate(A)} 
>>> for index, (first, second) in enumerate(A): 
...  if second in indices: 
...   print(f'Row {index} matches row {indices[second]}') 
... 
Row 0 matches row 1 
Row 1 matches row 2 
Row 2 matches row 0 
Row 3 matches row 0 
+3

[但是,似乎沒有嘗試從OP。](https://meta.stackoverflow.com/q/353940/846892) –

+0

謝謝。第一項是獨一無二的。所以這正是我所希望的! – Thomasedv

+0

@AshwiniChaudhary有時候......爲人類的更大利益而努力回答這些問題:p –

0

你看起來像一個圖的邊緣列表,你想要找出的是他們是否連接(即他們有一個共同的邊緣)。

您還有一個有向圖,邊的順序爲您的「匹配」計數(這與您定義的不一致)。

edge = [['a','b'], 
     ['b','c'], 
     ['c','a'], 
     ['d','a'], 
     ['e',None]] 

# order of edges doesn't count 
def is_connected(e1, e2): 
    return e1[0] == e2[1] or e1[1] == e2[0] 

# order of edges counts 
def is_child(e1, e2): 
    return e1[1] == e2[0] 

你想要的是第二檢查is_child,我認爲

print(is_connected(edge[0],edge[1])) 
print(is_connected(edge[1],edge[2])) 
print(is_connected(edge[0],edge[2])) 

print(is_child(edge[0],edge[1])) 
print(is_child(edge[1],edge[2])) 
print(is_child(edge[0],edge[2])) # false 
print(is_child(edge[2],edge[0])) 

如果您想通過第二座標,以檢查此類型圖中的所有邊面向連接的,你基本上要組並且在熊貓中有一個方便的功能groupby可以做到這一點:

import pandas as pd 
df = pd.DataFrame(edge) 

grouped = df.groupby(1) 
grouped.groups 
# Output: 
{'a': [2L, 3L], 'c': [1L], 'b': [0L]} 

grouped.groups['a'] 
# Output: 
# [2L, 3L] 

grouped[0].apply(lambda x: ','.join(x)).reset_index() 
# Output: 
# 1 0 
# 0 a c,d 
# 1 b a 
# 2 c b 
相關問題