我正在尝试将包含字符串(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和是否有任何相似之处但乍一看它对我来说并不像。很抱歉给您带来不便。
答案 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))