给定位置的列表中较低的元素

时间:2019-01-19 23:45:22

标签: python

如果我在上一个函数中占有一定位置,则必须在列表中降低字母。我必须编程的功能是lower_words

我遇到了一个问题:每当我降低一个元素时,该行就会重复。

为此,我不需要使用列表“单词”。只需将其留在此处,您就可以更好地了解该函数的功能/必须执行的操作。有人可以帮我吗?

words= ["PATO", "GATO", "BOI", "CAO"]

grid1= ["PIGATOS", 
       "ANRBKFD", 
       "TMCAOXA", 
       "OOBBYQU", 
       "MACOUIV", 
       "EEJMIWL"]

 positions_words_occupy = ((0, 0), (1, 0), (2, 0), (3, 0), (0, 2), (0, 3), (0, 4), (0, 5), (3, 2), (4, 3), (5, 4), (2, 2), (2, 3), (2, 4)) #these are the positions the words occupy. I have determined these positions with a previous function. first is the line, second the column  


def lower_words(grid, positions_words_occupy):

    new= []

    for position in positions_words_occupy:

        line= position[0]
        column= position[1]

        row= grid[line]
        element= row[column]

        new.append(row.replace(element, element.lower()))

    return new

预期输出:

['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']

实际输出:

['pIGATOS', 'aNRBKFD', 'tMCAOXA', 'ooBBYQU', 'PIgATOS', 'PIGaTOS', 'PIGAtOS', 'PIGAToS', 'OObbYQU', 'MACoUIV', 'EEJMiWL', 'TMcAOXA', 'TMCaOXa', 'TMCAoXA']

改变视角,您可以看到它降低了我在列表单词中的单词:

 ['pIgatoS', 
  'aNRBKFD', 
  'tMcaoXA', 
  'oObBYQU', 
  'MACoUIV', 
  'EEJMiWL']

2 个答案:

答案 0 :(得分:0)

我将首先在collections.defaultdict或集合中收集网格位置,然后在这些集合中存在小写字母的情况下重建字符串。

演示:

from collections import defaultdict

grid1 = ["PIGATOS", "ANRBKFD", "TMCAOXA", "OOBBYQU", "MACOUIV", "EEJMIWL"]

positions_words_occupy = (
    (0, 0),
    (1, 0),
    (2, 0),
    (3, 0),
    (0, 2),
    (0, 3),
    (0, 4),
    (0, 5),
    (3, 2),
    (4, 3),
    (5, 4),
    (2, 2),
    (2, 3),
    (2, 4),
)

d = defaultdict(set)
for grid, pos in positions_words_occupy:
    d[grid].add(pos)

result = []
for grid, pos in d.items():
    result.append(
        "".join(x.lower() if i in pos else x for i, x in enumerate(grid1[grid]))
    )

print(result)

输出:

['pIgatoS', 'aNRBKFD', 'tMcaoXA', 'oObBYQU', 'MACoUIV', 'EEJMiWL']

答案 1 :(得分:0)

您非常亲密!实际上,每次替换字母时,您实际上都将附加到新列表new上。这就是为什么您在列表中获得如此多的值的原因。

运行代码的另一种方法是创建grid1的副本,然后在每次替换字母时都替换每个单词。这是实现这些小的更改的新功能:

def lower_words(grid, positions_words_occupy):

    new = grid1.copy()

    for position in positions_words_occupy:

        line= position[0]
        column= position[1]

        row= new[line]
        element= row[column]

        #new.remove(row)
        new_word = row[:column] + element.lower() + row[column+1:]
        new[line] = new_word

    return new

正在运行lower_words(grid1, positions_words_occupy)的输出:

['pIgatoS', 'aNRBKFD', 'tMcaoXa', 'oObBYQU', 'MACoUIV', 'EEJMiWL']