2016-03-06 2 views
3

Я хочу сделать элементы 2d-списка в капитале из индекса, возвращаемого функцией. Например:Как сделать элементы из 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', 'a', 't'], ['T', 'e', ​​'t', 'k']] –

+0

Итак, причина, по которой «C» капитализируется, заключается в том, что она является первой «C» когда-либо, или первой «C» в строке? –

+0

Моя вспомогательная функция find_word_horizontal возвращает индекс [2,1]. Если найдено как горизонтальное, так и вертикальное совпадение, выберите только горизонтальное совпадение. Итак, вам нужно сделать что-то вроде первого перехода к индексу, а затем начать заглавные буквы в индексах [2,1], [2,2], [2,3]. Следовательно, получение слов в капитале «C», «A», «T» соответствует индексу. Вы должны сделать то же самое для вертикального совпадения, если не найдено ни одного совпадения по горизонтали, и для этого вам нужно перебирать столбец вместо исходного в горизонтальном совпадении. –

Смежные вопросы