簡體   English   中英

在python中,給定列表列表,如何識別匹配元素的索引?

[英]In python, given a list of lists, how do you identify the index of a matching element?

>>> birds = ['duck', 'chicken', 'goose']
>>> cats = ['tiger', 'lion']
>>> humans = ['human']
>>> at_the_zoo = [birds, cats, humans]

給出像at_the_zoo這樣的列表列表,如何找到老虎所在的列表?

for animal in sum(at_the_zoo, []):
    if "tiger" == animal:
        print "1 help!"

例如,我可以在動物列表中找到老虎,如果我使用枚舉,它會告訴我它在索引3處。我怎么知道它是列表at_the_zoo的元素1的一部分。 尋找鴨子會告訴我元素0等

謝謝!

我會想到這樣的事情:

def find_element(nested_lst, what):
    for idx, sublst in enumerate(nested_lst):
        try:
            idx2 = sublst.index(what)
            return (idx, idx2)
        except ValueError:
            pass

應該管用。

例:

>>> def find_element(nested_lst, what):
...     for idx, sublst in enumerate(nested_lst):
...         try:
...             idx2 = sublst.index(what)
...             return (idx, idx2)
...         except ValueError:
...             pass
... 
>>> birds = ['duck', 'chicken', 'goose']
>>> cats = ['tiger', 'lion']
>>> humans = ['human']
>>> find_element([birds, cats, humans], 'human')
(2, 0)
>>> find_element([birds, cats, humans], 'gator')  # returns None if not found.
>>> find_element([birds, cats, humans], 'tiger')
(1, 0)

值得注意的是, list.index平均list.index是一個O(N)操作,這意味着列表不是測試成員資格最有效的數據結構。 如果您的實際數據支持它,則可能值得考慮使用set

只需建立一個索引:

>>> birds = ['duck', 'chicken', 'goose']
>>> cats = ['tiger', 'lion']
>>> humans = ['human']
>>> at_the_zoo = [birds, cats, humans]
>>> index = {}
>>> for i, arr in enumerate(at_the_zoo):
...   index.update(zip(arr, [i]*len(arr)))
...
>>> index
{'tiger': 1, 'goose': 0, 'lion': 1, 'human': 2, 'duck': 0, 'chicken': 0}
>>> index.get('tiger')
1
>>>

要么:

>>> for i, arr in enumerate(at_the_zoo):
...   arr_len = len(arr)
...   index.update(zip(arr, zip([i]*arr_len, range(arr_len))))
...
>>> from pprint import pprint
>>> pprint(index)
{'chicken': (0, 1),
 'duck': (0, 0),
 'goose': (0, 2),
 'human': (2, 0),
 'lion': (1, 1),
 'tiger': (1, 0)}
>>> index.get('tiger')
(1, 0)

找到了兩個答案,但@ newtover對我的口味來說有點過於神秘,@ mgilson沒有按照要求回答問題。 讓我來吧。

def find_in_inner(lst, target):
    for i, sublst in enumerate(lst):
        if target in sublst:
            return i

>>> birds = ['duck', 'chicken', 'goose']
>>> cats = ['tiger', 'lion']
>>> humans = ['human']
>>> at_the_zoo = [birds, cats, humans]
>>> find_in_inner(at_the_zoo, "tiger")
1

對於列表列表的特定情況,如果您想要子列表編號的元組和索引到該子列表中,您可以執行以下操作:

[(i,j) for i, sl in enumerate(LoL) for j,e in enumerate(sl) if e==tgt]

演示:

>>> birds = ['duck', 'chicken', 'goose']
>>> cats = ['tiger', 'lion']
>>> humans = ['human']
>>> zoo = [birds, cats, humans]
>>> tgt='lion'
>>> [(i,j) for i, sl in enumerate(zoo) for j,e in enumerate(sl) if e==tgt]
[(1, 1)]

這正確處理了子列表中多個目標的潛在情況。

如果您知道您只關心第一個實例,您可以:

[(i,sl.index(tgt)) for i, sl in enumerate(zoo) if tgt in sl] 

如果您不關心是否消除了重復項並且需要快速訪問,則可以構建索引:

{e:(i,j) for i, sl in enumerate(zoo) for j, e in enumerate(sl)}
# {'tiger': (1, 0), 'goose': (0, 2), 'lion': (1, 1), 'human': (2, 0), 'duck': (0, 0), 'chicken': (0, 1)}

假設在每種情況下都有一個名為'bob'的人,貓和鳥:

birds = ['duck', 'chicken', 'goose', 'bob']
cats = ['tiger', 'lion','bob']
humans = ['human','bob']

您可以構造一個索引,以這種方式正確處理多個子列表中的多個條目:

index={}
for i, sl in enumerate(zoo):
    for j, item in enumerate(sl):
        index.setdefault(item, []).append((i,j))

指數變為:

  {'tiger': [(1, 0)], 
   'goose': [(0, 2)], 
   'lion': [(1, 1)], 
   'human': [(2, 0)], 
   'duck': [(0, 0)], 
   'chicken': [(0, 1)], 
   'bob': [(0, 3), (1, 2), (2, 1)]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM