将两个部分匹配的字符串列表匹配到另一个列表中

时间:2016-06-01 04:10:18

标签: python list match

我正在尝试将包含字符串(50个字符串)的List与包含字符串的列表进行匹配,这些字符串是上一个列表中某些字符串的一部分(5个字符串)。我将发布完整的代码以提供下面的上下文,但我也想举一个简短的例子:

List1 = ['abcd12', 'efgh34', 'ijkl56', 'mnop78']

List2 = ['abc', 'ijk']

我想返回List1中匹配List2的字符串列表。我试图用set.intersection做一些事情,但似乎你不能与它做部分匹配(或者我不能用我有限的能力)。我也试过了any(),但我没有成功使它与我的列表一起工作。在我的书中它说我应该使用嵌套循环,但我不知道我应该使用哪个函数以及如何使用列表。

以下是完整的代码作为参考:

#!/usr/bin/env python3.4
# -*- coding: utf-8 -*-

import random

def generateSequences (n):

    L = []
    dna = ["A","G","C","T"]
    for i in range(int(n)):

        random_sequence=''

        for i in range(50):
            random_sequence+=random.choice(dna)

        L.append(random_sequence)

    print(L)
    return L

def generatePrefixes (p, L):

    S = [x[:20] for x in L]
    D = []
    for i in range(p):
        randomPrefix = random.choice(S)
        D.append(randomPrefix)

    return S, D

if __name__ == "__main__":
    L = generateSequences(15)
    print (L)
    S, D = generatePrefixes(5, L)
    print (S)
    print (D)

编辑:因为这被标记为可能的副本我想编辑这个以便说在这篇文章中使用python而另一个是用于R.我不知道R和是否有任何相似之处但乍一看它对我来说并不像。很抱歉给您带来不便。

4 个答案:

答案 0 :(得分:4)

使用嵌套for循环:

def intersect(List1, List2):
    # empty list for values that match
    ret = []
    for i in List2:
        for j in List1:
            if i in j:
                ret.append(j)
    return ret

List1 = ['abcd12', 'efgh34', 'ijkl56', 'mnop78']
List2 = ['abc', 'ijk']
print(intersect(List1, List2))

答案 1 :(得分:2)

这可能不是最有效的方式,但它有效

matches = []

for seq_1 in List1:
    for seq_2 in List2:
        if seq_1 in seq_2 or seq_2 in seq_1:
            matches.append(seq_1)
        continue

答案 2 :(得分:1)

尝试

[l1 for l1 in List1 if any([l2 in l1 for l2 in List2])]

答案 3 :(得分:1)

您可以只比较字符串,我从list1中删除包含list2项的结果列表中的任何重复项。这基本上是你想要的:

f = []
for i in list1:
  for j in list2:
    if j in i:
      f.append(i)
result = list(set(f))