所以我有两个列表L1就像这样:
L1 = ['12:55:35.87', '12:55:35.70', ...]
L2 = ['12:55:35.53', '12:55:35.30', ...]
我试图在两个列表中找到以相同的4个字符开头的对,即 xx:x然后返回每个列表的对的索引
到目前为止,我有:
for pair1 in L1:
for pair2 in L2:
if pair1[:4] in pair2:
print(L1.index(pair1))
这似乎没有返回正确的索引,显然它不会返回第二个列表的索引。任何帮助将不胜感激。
答案 0 :(得分:7)
以下是如何使代码正常工作。请记住,这是一个天真的解决方案,如果您的列表很大,有更快的方法来解决这个问题。这里的运行时间是O(n ^ 2),但这可以在线性时间内解决。
for i,pair1 in enumerate(L1):
for j,pair2 in enumerate(L2):
if pair1[:4] == pair2[:4]:
print("list1: %s , list2: %s" % (i,j))
更新:对于未来的访问者来说,这是一个平均线性时间解决方案:
from collections import defaultdict
l1_map = defaultdict([])
for i,val in enumerate(L1):
prefix = val[:4]
l1_map[prefix].append(i)
for j,val in enumerate(L2):
prefix = val[:4]
for l1 in l1_map[prefix]:
print("list1: %s , list2: %s" % (l1,j))
答案 1 :(得分:3)
因为OP列表似乎有很多重复的"第一个4个字符",我会做类似以下的事情:
indices = {}
for i, entry in enumerate(L1):
indices.setdefault(entry[:4], [])
indices[entry[:4]].append("L1-{}".format(i))
if L2[i][:4] in indices:
indices[L2[i][:4]].append("L2-{}".format(i))
然后您可以访问重复的条目:
for key in indices:
print(key, indices[key])
这比O(n ^ 2)好。
编辑:正如有人在评论中指出的那样,假设这些列表的长度相同。
如果他们没有,假设L2
大于L1
,那么在执行上述操作后,您可以执行以下操作:
for j, entry in enumerate(L2[i+1:]):
indices.setdefault(entry[:4], [])
indices[entry[:4]].append("L2-{}".format(j))
如果L2
短于L1
,只需更改所显示代码中的变量名称。
答案 2 :(得分:2)
您可以使用itertools.product
循环笛卡尔积。
PostListComponent
答案 3 :(得分:1)
使用for循环中的range()
或enumerate()
函数为您提供循环索引。
例如,使用range()
函数:
for x in range(len(L1)):
for y in range(len(L2)):
if L1[x][:4] == L2[y][:4]:
print(x, y)
答案 4 :(得分:1)
枚举很适合这样的事情。
indexes = []
for index1, pair1 in enumerate(L1):
pair1_slice = pair1[:4]
for index2, pair2 in enumerate(L2):
if pair1_slice == pair2[:4]:
indexes.append([index1, index2])
print(index1, index2)
答案 5 :(得分:1)
我认为enumerate
功能是您正在寻找的功能!
L1 = ['12:55:35.87', '12:55:35.70', 'spam']
L2 = ['12:55:35.53', 'eggs', '12:55:35.30']
idxs = []
for idx1, pair1 in enumerate(L1):
for idx2, pair2 in enumerate(L2):
if pair1[:4] == pair2[:4]:
idxs.append((idx1, idx2))
print(idxs)
输出
[(0, 0), (0, 2), (1, 0), (1, 2)]