2013-04-05 35 views
6

我有列表的列表搜索列表:使用字符串

A = [['andy', 'dear', 'boy', 'tobe', 'todo'], 
     ['where', 'what', 'when', 'how'], 
     ['korea', 'japan', 'china', 'usa'], 
     ['tweet', 'where', 'why', 'how']] 

我有三個問題確切的說:

  1. 我如何從這份名單中檢索子列表使用特定元素作爲關鍵字?
    例如,我想檢索所有列表中包含「爲什麼」元素的列表?什麼是
    這樣做的最佳方式?
  2. 如何使用特定元素的一部分作爲關鍵字從此列表中檢索子列表?
    例如,我想檢索所有包含「wh」元素的列表作爲開始
    任何元素的字符?
  3. 我如何從這兩種搜索方法中的任何一種獲得最終子列表的位置或索引?

我所熟悉的檢索所有從列表中的元素與特定關鍵字匹配的概念,但其混亂的,當涉及到檢索所有匹配的特定關鍵字列表...

任何猜測?提前致謝。

回答

2

對於第一:

>>> for l in A: 
...  if 'why' in l: 
...    print l 
... 
['tweet', 'where', 'why', 'how'] 

對於第二:(WY任何地方)

>>> for l in A: 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      break 
... 
['where', 'what', 'when', 'how'] 
['tweet', 'where', 'why', 'how'] 

在開始測試嘗試:(使用startswith()從@Harido

>>> for l in A: 
...  for i in l: 
...    if i.startswith('wh'): 
...      print l 
...      break 
... 
['where', 'what', 'when', 'how'] 
['tweet', 'where', 'why', 'how'] 

對於第三:

要查找索引,可以打印雄蕊後使用A.index(l)方法,例如:

>>> for l in A: 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      print A.index(l) 
...      break 
... 
['where', 'what', 'when', 'how'] 
1 
['tweet', 'where', 'why', 'how'] 
3 

但是請記住,我不是在Python好。有人可以給你更好的方法。 (我寫C代碼一樣是差​​)我想和大家分享此鏈接:Guido van Rossum

編輯

感謝@Jaime以表明我for k, l in enumerate(A):

>>> for k, l in enumerate(A): 
...  for i in l: 
...    if 'wh' in i: 
...      print l 
...      print "index =", k 
...      break 
... 
['where', 'what', 'when', 'how'] 
index = 1 
['tweet', 'where', 'why', 'how'] 
index = 3 
+1

好槍,格里傑什!這是非常好的。我只能將一個問題標記爲正確的答案,而你的問題可能就是其中之一。讓我等待接下來的回答2和3(或者如果你可以添加)。 – khan 2013-04-05 05:15:26

+0

@好好完成評論。但是我不擅長Python等待像[martijn-pieters](http://stackoverflow.com/users/100297/martijn-pieters)這樣的人獲得更好的答案 – 2013-04-05 05:27:07

+1

而不是執行'A.index(l)',改變for循環到'for k,l枚舉(A):'和'k'是'l'的索引而不需要查找它。 – Jaime 2013-04-05 05:37:18

0

你請按照與單個列表相同的方式執行此操作,除非您需要額外的循環:

for inner_list in A: 
    for element in inner_list: 
     if # <some condition> 
      # <do something> 

對於posi在你想要的位置將有所幫助的特定循環中增加一個enumerate,或者對每個內部列表只需使用類似find的東西也可以完成這項工作。

3

所有的答案組合:

mylist = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']] 
for num, sublist in enumerate(mylist): 
    if 'why' in sublist: 
     print sublist 
    for ele in sublist: 
     if ele.startswith('wh'): 
      print ele, num 
+0

謝謝,Haidro。這真的很好。我不知道像string.startswith()和string.endswith()已經存在。非常感謝。 :-) – khan 2013-04-05 05:21:47

+0

@khan它是這些函數,使我愛Python的簡單性:D – TerryA 2013-04-05 05:23:11

+0

@Haidro用python獲得索引的最好方法是使用'enumerate'。檢查'A.index(x)'將不得不再次搜索列表中的項目,因此將不適用於重複列表 – jamylak 2013-04-05 05:40:12

0

一個。假設你有一個清單A,你正在尋找的詞是x。

def howmuch(word) 
    lis = [] 
    for x in A: 
     //point A 
     if x.count(word) > 0: 
     //point A 
      lis.append(x) 
    return lis 

基本上,lis是一個列表,它包含所有包含該詞的列表。你遍歷原始列表。每個元素x是一個列表。 x.count(單詞)告訴你這個單詞在這個列表中有多少次。 0表示它從未出現在列表中。所以如果它大於0,它必須在列表中。如果是這樣,我們添加到我們的lis變量。然後我們返回它。

b。除了在A點之外,它與問題a是一樣的,在獲得列表之後,爲那裏的每個單詞做另一個for循環。爲Python,有一個查找函數的字符串,看看是否在那裏存在一個子,如果它存在,然後將其附加到列表元素:

http://docs.python.org/2/library/string.html

℃。對於問題a,在檢查計數大於0之後,這意味着該單詞存在於列表中。做一個list.index(單詞),它會返回索引。對於問題b,一旦你找到一個正確的子串的字符串,做一個list.index(單詞)。總之,你應該看看python網站,它告訴你很多你可以使用的功能。

+0

'對於A中的每個x:'是無效的語法:3。 – TerryA 2013-04-05 05:38:18

+0

謝謝你對此抱歉,對它應該是「for x in A:」我猜想,因爲它遍歷整個列表,它有點認爲它是每個。我把它和別的東西混淆了。 – Jeff 2013-04-05 05:44:27

0
>>> A = [['andy', 'dear', 'boy', 'tobe', 'todo'], ['where', 'what', 'when', 'how'], ['korea', 'japan', 'china', 'usa'], ['tweet', 'where', 'why', 'how']] 
>>> for i, sublist in enumerate(A): 
     if 'why' in sublist: 
      print i, sublist 


3 ['tweet', 'where', 'why', 'how'] 
>>> for i, sublist in enumerate(A): 
     if any(word.startswith('wh') for word in sublist): 
      print i, sublist 


1 ['where', 'what', 'when', 'how'] 
3 ['tweet', 'where', 'why', 'how'] 
2

我喜歡列表理解和函數式編程,所以這裏的這種做法

一個

sub_list_a = [ el for el in A if 'why' in el ] 

sub_list_b = [ el for el in A if any(['wh' in s for s in el]) ] 

一點更難看了,但簡潔而敏銳IBLE。

Ç

然後得到的,其中每個sub_lists被發現

location_a = [ ii for ii, el in enumerate(A) if el in sub_list_a ] 

只需更換ba以獲取部分b中的位置的索引。

+1

更優雅和簡潔的** B **:'sub_list_b = [el對於el中的任何(如果有的話)('s中的s')。 imo儘量不要使用'map'如果你必須使用'lambda' – jamylak 2013-04-05 05:42:34

+0

@jamylak是的,我更喜歡那樣,謝謝!儘管如此,小編輯並沒有爲我工作,請參閱上文。 – 2013-04-05 05:46:54

+1

還應該省略'any'中的括號,以便它將成爲發生器而不是列表comp。 – jamylak 2013-04-05 06:27:13

6

簡單和直接

elem = 'why' 
index_li = [] 
for idx, item in enumerate(A): 
    for word in item: 
     if word.startswith(elem): 
      index_li.append(idx) 
      break 
print index_li 

>>> elem = 'wh' 
... index_li = [] 
... for idx, item in enumerate(A): 
...  for word in item: 
...   if word.startswith(elem): 
...    print word, item 
...    index_li.append(idx) 
...    break 
... print index_li 
where ['where', 'what', 'when', 'how'] 
where ['tweet', 'where', 'why', 'how'] 
[1, 3] 
0

你可以用這個簡單的方法:

>>> key='wh' 
>>> res=[(index, sublist) for index, sublist in enumerate(A) for value in sublist if value.startswith(key)] 
>>> dict(res) 
{1: ['where', 'what', 'when', 'how'], 3: ['tweet', 'where', 'why', 'how']} 

享受!