【问题标题】:Python String Match with respective indexPython字符串匹配相应的索引
【发布时间】:2018-06-16 04:25:39
【问题描述】:
str1 = ['106.51.107.185', '122.169.20.139', '123.201.53.226']
str2 = ['106.51.107.185', '122.169.20.138', '123.201.53.226']

我需要根据它们各自的索引来匹配上面的字符串。

str1[0] 匹配 str2[0]

str1[1] 匹配 str2[1]

str1[2] 匹配 str2[2]

基于匹配我需要输出。

我从最后开始尝试,在 2 个字符串之间,str[0] 正在检查与 str2[:] 的匹配,它只需要与各自的索引匹配。请帮忙。

谢谢!!!

【问题讨论】:

  • 这里的输出应该是什么? [True, False, True]?
  • 您好 Willem,我正在分别寻找非匹配索引和匹配索引输出

标签: python


【解决方案1】:

真值

你可以使用:

from operator import eq

map(eq, str1, str2)

这将在 中生成一个可迭代的布尔值(True 或False),并在 中生成一个布尔值列表。如果您想要 中的列表,您可以在map(..) 上使用list(..) 构造:

from operator import eq

list(map(eq, str1, str2))

这是有效的,因为map 将函数(此处为来自operator 包的eq 和一个或多个可迭代对象)作为第一个参数。然后它将在可迭代对象的参数上调用该函数(因此str1 和str2 的第一项,然后str1 和str2 的第二项,依此类推)。产生了该函数调用的结果。

指数

或者,我们可以使用列表推导来获取索引,例如:

same_indices = [i for i, (x, y) for enumerate(zip(str1, str2)) if x == y]

或不同的:

diff_indices = [i for i, (x, y) for enumerate(zip(str1, str2)) if x != y]

我们也可以重用上面的map结果:

from operator import eq, itemgetter

are_same = map(eq, str1, str2)

same_indices = map(itemgetter(0),
                   filter(itemgetter(1), enumerate(are_same))
                  )

如果我们然后将same_indices 转换为一个列表,我们会得到:

>>> list(same_indices)
[0, 2]

我们也可以在are_diff上执行这样的构造:

from operator import ne, itemgetter

are_diff = map(ne, str1, str2)

diff_indices = map(itemgetter(0),
                   filter(itemgetter(1), enumerate(are_diff))
                  )

【讨论】:

  • 我得到错误:map(eq(ip, outer)) TypeError: map() 需要至少两个参数
  • @selvamsamymuthu:它不是,map(eq(str1, str2)),而是map(eq, str1, str2)
【解决方案2】:

您可以使用 zip 和列表理解,即

[i==j for i,j in zip(str1,str2)]

[True, False, True]

【讨论】:

  • 谢谢!!!,我需要匹配和不匹配的输出。
【解决方案3】:

以下是使用for循环的简单解决方案:

res = []
for i in range(len(str1)):
    res.append(str1[i] == str2[i])
print(res)

输出:

[True, False, True]

也可以使用list comprehension:

res = [ (str1[i] == str2[i])     for i in range(len(str1)) ]

编辑:获取匹配和不匹配的索引:

matched = []
non_matched = []
for i in range(len(str1)):
    if str1[i] == str2[i]:
        matched.append(i)
    else:
        non_matched.append(i)
print("matched:",matched)
print("non-matched:", non_matched)

输出:

matched: [0, 2]
non-matched: [1]

【讨论】:

  • 运行此程序时出现错误。错误:“res.append(ip(i)==outer(i)) TypeError: 'str' object is not callable”
  • ip 和 outer 是什么?他们不是这个问题的一部分。你不应该偏离这个问题。您可以发布另一个问题,提供ip 和outer 的详细信息。
  • 对不起,ip 是 str1,outer 是 str2。我在运行时使用 ip 和 external。
  • 我得到了您最初发布的预期结果。取而代之的是真假,需要不匹配的索引作为结果
  • 我在上面的答案中添加了代码来获取匹配和不匹配项目的列表。如果它解决了您的问题,您应该点击左侧的复选标记来接受它。
【解决方案4】:

我不确定您需要的确切输出,但是,如果您想比较这两个列表并获得它们之间的差异,您可以将它们转换为 set,然后按如下方式减去它们:

st = str(set(str1) - set(str2))

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 2018-04-06
    • 1970-01-01
    • 2020-06-08
    • 2019-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    相关资源
    最近更新 更多