2013-04-05 51 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']} 

享受!