Есть ли способ перебрать несколько списков и переименовать второе вхождение? - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь перебрать несколько списков и проверить, встречается ли этот список несколько раз. Если это так, я хочу переименовать его списки.

Я пытался зацикливаться, используя два цикла for, но этот код прекрасно работает для одного списка, а не для нескольких списков.

new_word = [['abc'],['out'],['pqr'],['abc']]

for i in range(len(new_word)-1):
    word_counter = 1
    for j in range(i+1, len(new_word)):
        if new_word[i] == new_word[j]:
            word_counter = word_counter + 1
            new_word[j] = new_word[j] + "_" + str(word_counter)
        if word_counter > 1:
            new_word[i] = new_word[i] + "_1"

Ожидается:

[['abc_1'],['out'],['pqr'],['abc_2']]

Фактически:

[['abc'],['out'],['pqr'],['abc']]

Ответы [ 3 ]

0 голосов
/ 16 октября 2019

Попробуйте это:

new_word = [['abc'],['out'],['pqr'],['abc']]

res=[[el[0]] if new_word.count(el)<2 else [el[0]+"_"+str(new_word[:k].count(el)+1)] for k, el in enumerate(new_word)]

print(res)

И вывод:

[['abc_1'], ['out'], ['pqr'], ['abc_2']]
[Program finished]
0 голосов
/ 16 октября 2019

Это немного более многословно, чем принятый ответ, но только один раз отсканирует все элементы оригинального списка. Это не имеет значения для небольших списков (<10000 элементов) и отсутствия критического времени отклика (например, вам не нужно передавать этот результат в ответ HTTP несколько раз в секунду, например). </p>

from copy import deepcopy


def suffix_repeats(lst):
    result = deepcopy(lst)
    mapping = {}
    for i, item in enumerate(lst):
        mapping.setdefault(item[0], []).append(i)

    for key, positions in mapping.items():
        if len(positions) > 1:
            for j, pos in enumerate(positions, 1):
                result[pos][0] += f"_{j}"
    return result



new_word = [['abc'],['out'],['pqr'],['abc']]

print(suffix_repeats(new_word))
0 голосов
/ 16 октября 2019
new_word = [["abc"], ["out"], ["pqr"], ["abc"]]

for i in range(len(new_word) - 1):
    word_counter = 1
    for j in range(i + 1, len(new_word)):
        if new_word[i] == new_word[j]:
            word_counter = word_counter + 1
            new_word[j] = [new_word[j][0] + "_" + str(word_counter)]
        if word_counter > 1:
            new_word[i] = [new_word[i][0] + "_1"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...