2016-03-06 59 views
3

我想从函数返回的索引中创建大写的2d列表元素。例如:如何从给定索引中创建二维列表资本的元素?

crosswords=[['s','d','o','g'],['c','u','c','m'],['a','x','a','t'],['t','e','t','k']] 
word='cat', 

然后我的函数将返回:

[['s','d','o','g'],['C','u','c','m'],['A','x','a','t'],['T','e','t','k']] 

这是我曾尝试:

def find_word_vertical(crosswords, word): 
    x=zip(*crosswords) 
    #print x 
    for row in x: 
     join_list = "".join(row) 
     if join_list.find(word) != -1: 
      return [row.index(word[0]),x.index(row)] 
      break 
    def find_word_horizontal(crosswords, word): 

    for row in crosswords: 
     join_list = "".join(row) 
     if join_list.find(word) != -1: 
      return [crosswords.index(row), row.index(word[0])] 
      break 

def capitalize_word_in_crossword(crosswords,word): 

    if find_word_horizontal or find_word_vertical is not None: 
     for i in word: 
      for j in crosswords: 
       if i in j: 
        i.upper() 
        return crosswords 

这里的结果是什么:

[['s', 'd', 'o', 'g'], ['c', 'u', 'c', 'm'], ['a', 'c', 'a', 't'], ['t', 'e', 't', 'k']] 

灿任何人都帮助我?

回答

1

您可以使用列表理解来查找横向和纵向事件。

水平出现如下:

>>> filter(
    lambda (_, j): j > -1, 
    [(i, ''.join(w).find(word)) for i, w in enumerate(crosswords)]) 
[] 

垂直事件是:

>>> filter(
    lambda (i, _): i > -1, 
    [(''.join(w[j] for w in crosswords).find(word), j) for j in range(len(crosswords))]) 
[(1, 0), (1, 2)] 

随着出现,很容易选择如何处理它们(选择开启或都做,宁愿水平,以垂直等),包括利用它们。

+0

谢谢您的回复。但我只想要第一场比赛的资本元素。我的函数接受一个二维字符列表(如纵横字谜)和一个字符串(字)作为输入参数。该函数搜索2d列表的行和列以找到匹配的单词。如果找到匹配项,则此函数将大写匹配字符的二维列表并返回该列表。我的函数应该返回[['s','d','o','g'],['C','u','c','m'],['A','x', '','','',''''']] –

+0

所以'C'的大写原因是它是第一个'C',或者第一个'C'在行中? –

+0

我的帮助函数find_word_horizo​​ntal返回索引[2,1]。如果同时发现水平和垂直匹配,则只选择水平匹配。所以,你必须先做索引,然后开始在索引[2,1],[2,2],[2,3]中对单词进行大写处理。因此,在索引中分别用大写字母“C”,“A”,“T”表示。如果没有找到水平匹配,您必须对垂直匹配执行相同操作,并且您必须遍历列而不是水平匹配的原始数据。 –

相关问题