Python-检查列表中的字符串/缩写是否存在于另一个列表中

时间:2019-06-29 05:40:52

标签: python string list

我正在尝试检查一个列表中的名称或缩写是否存在。

我有2个类似的列表:

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

在上面的列表中,来自l1的“ JACK”和“ JOHN”都与l2中的初始“ J”匹配,来自l1的“ JACK”与l2中的“ JACK”匹配。 l1中的“ A”也与l2中的“ ANN”匹配。与“ 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中的完整名称匹配)

请稍加说明,因为我只是初学者,而python是我的第一门编程语言。

编辑:按照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 个答案:

答案 0 :(得分:1)

这是我刚刚在旅途中写的东西。检查它是否适合您。这段代码可以进一步简化,但这是您的工作;)

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 :(得分:1)

如果我正确理解了您的问题,请尝试以下操作:

  1. 从l2创建2个列表,其中1个仅带有缩写以检查l1,其中 长度大于1。

  2. 以l2开头的其他列表,用于检查l1中length = 1的项目。

代码:

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']

答案 2 :(得分:1)

您可以简单地遍历list(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)