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

У меня есть 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, и все остальные элементы соответствуют, результатом должно быть «Полное соответствие».

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

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

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

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

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

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)
-1
rawm 29 Июн 2019 в 08:40

3 ответа

Лучший ответ

Вы можете просто перебрать список (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
kuldeep rawani 30 Июн 2019 в 04:44

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

  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
MYGz 2 Июл 2019 в 09:31

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

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")
1
Mihran Thalhath 29 Июн 2019 в 06:15