Python - Проверьте, присутствуют ли строки / инициалы в списке в другом списке - PullRequest
0 голосов
/ 29 июня 2019

Я пытаюсь проверить, присутствуют ли имена или инициалы в одном списке в другом списке.

У меня есть 2 списка, как:

l1 = ["JACK", "JOHN", "A", "PAUL", "STEVE"]
l2 = ["J", "ANN", "JACK", "STEVEN", "P"]

В приведенном выше списке «JACK» и «JOHN» из l1 совпадают с начальным «J» в l2, а «JACK» из l1 совпадает с «JACK» в l2. Также «A» из l1 совпадает с «ANN» в l2. Аналогично с «PAUL» и «P», но «STEVE» и «STEVEN» не совпадают. Таким образом, результат должен быть «Не полное совпадение».

Но если у l1 не было "STEVE" и было бы похоже:

l1 = ["JACK", "JOHN", "A", "PAUL"]

Поскольку "STEVE" или "S" не существует в l2, а все остальные элементы совпадают, результатом должно быть "Full match".

Таким образом, я должен иметь все элементы в l1 как полностью присутствующие или как инициалы в l2, но наличие всех элементов из l2 в l1 необязательно.

Я пробовал код из других похожих вопросов, но ни один из них не дал точного результата. Они выводят положительный результат, так как они либо соответствуют только инициалам всех элементов, либо даже соответствуют «STEVE» с «STEVEN», что мне не нужно.

Я полагаю, что это может быть сделано условным оператором, который проверяет все элементы в любом списке, имеющие длину 1, с первым индексом всех элементов в другом списке (так что любой инициал в любом списке сопоставляется со всеми полными именами ); и полные строки только из l1 с полными строками в l2 (так что полные имена только из l1 сопоставляются с полными именами в l2)

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

РЕДАКТИРОВАТЬ: По просьбе Devesh я вставляю ниже весь код, который я пытался.

for elem in l2 or elem in l1:
    if (len(elem)) == 1:
        print('yes')
        if any(elem[0] for elem in l1) == any(elem[0] for elem in l2):
            print("yes")
for elem in l1 or elem in l2:
    if l1[elem][0]  == l2[elem][0]:
        print("yes")
for elem in l1:
    if len(elem) == 1:
        print([elem for elem in l1 if any(elem in x for x in l2)])
        print([elem for elem in l2 if any(elem in x for x in l1)])
for b in l2:
  for a in l1:
    if a in b or b in a:
      present.add(b)
      break
    else:
      notPresent.add(b)

print(present)
print(notPresent)

Ответы [ 3 ]

1 голос
/ 29 июня 2019

Если я правильно понял ваш вопрос, вот как вы можете его попробовать:

  1. Создайте 2 списка из l2, 1 только с инициалами, чтобы проверить для l1, где длина больше 1.

  2. Другой список с инициалами из l2 для проверки элементов, имеющих длину = 1 в l1.

Код:

l1 = ["JACK", "JOHN", "A", "PAUL", "STEVE"]
l2 = ["J", "ANN", "JACK", "STEVEN", "P"]
one_letter = [x for x in l2 if len(x)==1]
first_letter = [x[0] for x in l2 if len(x)>1]

l3=[]
for x in l1:
    if len(x)>1:
        if x[0] in one_letter:
            l3.append(x)
    else:
        if x in first_letter or x in l2:
            l3.append(x)

print(l3)

Укороченная версия:

l4 = [x if x[0] in one_letter else x if x in first_letter or x in l2 else '' for x in l1]
l4.remove('')

Выход:

['JACK', 'JOHN', 'A', 'PAUL']
1 голос
/ 29 июня 2019

Вы можете просто перебрать список (l1) и проверить, присутствует ли элемент в l2, если нет, проверить наличие первого символа.Если нет, вы можете просто вернуться.

l1 = ["JACK", "JOHN", "A", "PAUL", "STEVEN"]
l2 = ["J", "ANN", "JACK", "STEVEN", "P"]


def compare(l1, l2):
    for i in l1:
        if not (i in l2 or i[0] in l2):
            if len(i) == 1:
                is_matched = False
                for j in l2:
                    if ( j[0] == i):
                        is_matched = True
                if not is_matched:
                    return "not matched"
            else:
                return "not matched"
    return "matched"

print compare(l1, l2)
1 голос
/ 29 июня 2019

Это то, что я только что написал на ходу. Проверьте, работает ли он для вас. Этот код можно еще упростить, но это работа для вас;)

l1 = ["JACK", "JOHN", "A", "PAUL", "STEVE"]
l2 = ["J", "ANN", "JACK", "STEVEN", "P"]
i = 0
length1 = len(l1)
length2 = len(l2)
for first in l1:
    count = 0
    for second in l2:
        count += 1
        if len(second) == 1:
            if first[0] == second:
                break
        elif len(first) == 1:
            if first == second[0]:
                break
        else:
            if first == second:
                break
        if count == length2:
            i = 1
if i == 1:
    print("Not Match")
else:
    print("Match")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...