Сравнивая строки в списке? - PullRequest
       0

Сравнивая строки в списке?

1 голос
/ 20 февраля 2020

У меня есть набор строк в списке, список приведен ниже в коде. Я хотел бы сравнить каждую строку с ее предыдущими строками. Очевидно, что первая позиционированная строка не будет сравниваться с предыдущей строкой, поскольку ее нет. Логика c в основном: 2-я позиционированная строка для сравнения с 1-й позиционированной строкой, 3-я позиционная строка для сравнения с 1-й и 2-й позиционированной строкой, ... ...

s = ["avocado", "banana", "carrot", "avocado", "carrot", "grapes", "orange"]
for i in range(2,len(s)):
    for j in range(i,2, -1):
        if s[i] == s[j]:
            print (s[i])

Теперь, если совпадение найдено, будет показано имя строки с позициями. Такие как avocado found in position 4 and 1. Я застрял в этом коде. Как мне поступить?

Ответы [ 5 ]

3 голосов
/ 20 февраля 2020

Другой подход заключается в том, что вы можете составить словарь предметов на позиции

from collections import defaultdict

d = defaultdict(list)
for i in range(len(s)):
    d[s[i]].append(i + 1) # '+ 1' since we count from 1-index

for item, positions in d.items():
    if len(positions) > 1:
        print("{} found at positions {}".format(item, positions))

2 голосов
/ 20 февраля 2020

Это, кажется, подходит для общего случая использования:

a = ['a','b','c','d','e','a','b','e','d']

for i in list(set(a)):
    b = [j for j, e in enumerate(a) if e == i]
    if len(b) > 1:
        print(i," found in positions:",b )

Вывод:

b  found in positions: [1, 6]
a  found in positions: [0, 5]
d  found in positions: [3, 8]
e  found in positions: [4, 7]
2 голосов
/ 20 февраля 2020
s = ["avocado", "banana", "carrot", "avocado", "carrot", "grapes", "orange"]
for i in range(1, len(s)):
    for j in range(i):
        if s[i] == s[j]:
            print(s[i])

Вы были близки. Используйте range(i) для подсчета от 0 до i. Используйте индекс 1, чтобы получить второй элемент в списке (списки начинаются с 0).

1 голос
/ 20 февраля 2020

Сначала вы должны определить позиции всех слов, например, в словаре. Затем вы можете напечатать слова с позициями:

from collections import defaultdict
positions = defaultdict(list)
s = ["avocado", "banana", "carrot", "avocado", "carrot", "grapes", "orange"]
for position, word in enumerate(s):
    positions[word].append(position)

for word, position in positions.items():
    print(f"{word} found at positions {' and '.join(position)}")
0 голосов
/ 20 февраля 2020

Вы можете использовать функцию комбинаций из itertools для эффективного go по всем парам:

s = ["avocado", "banana", "carrot", "avocado", "carrot", "grapes", "orange"]
from itertools import combinations
matches = [(w1,p1,p2) for (p1,w1),(p2,w2) in combinations(enumerate(s),2) if w1==w2]
print("\n".join(f"{word} found in position {p1} and {p2}" for word,p1,p2 in matches))


# avocado found in position 0 and 3
# carrot found in position 2 and 4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...