gpt4 book ai didi

python - 比较字符串列表中各自元素的后缀

转载 作者:行者123 更新时间:2023-11-30 23:09:35 24 4
gpt4 key购买 nike

假设我有一个这样的列表

myList = ['A_x','B_x','C_x','D_x']

以及这样的列表列表

myListOfList = [['A_x','B_y','C_x','D_z'],
['A_y','B_y','C_y','D_y'],
['A_u','B_y','C_y','D_y'],
['A_y','C_y','B_y','D_y', 'E_l'],
['A_y','P_y','T_y','D_y'],
['A_y','B_y','C_y'],
['A_y','C_y','D_y','B_y'],
['A_z','C_z','D_z','B_z']]

现在我想确定 myListOfList 中与 myList 相同的所有列表,除了这些列表中各个元素的后缀,其中元素的后缀myListOfList 的子列表必须相同。所以在上面的例子中我想找到:

#all elements as in myList but with suffix y instead of x
['A_y','B_y','C_y','D_y']
#all elements as in myList but with suffix y instead of x but in different order
['A_y','C_y','D_y','B_y']
#all elements as in myList but with suffix z instead of x but in different order
['A_z','C_z','D_z','B_z']

但我不想找到其他元素,因为它们的后缀不同,长度与 myList 的 长度不同,或者元素的第一部分与 中的元素不同>我的列表

我的实现如下:

myList = ['A_x','B_x','C_x','D_x']

myListOfList = [['A_x','B_y','C_x','D_z'],
['A_y','B_y','C_y','D_y'],
['A_u','B_y','C_y','D_y'],
['A_y','C_y','B_y','D_y', 'E_l'],
['A_y','P_y','T_y','D_y'],
['A_y','B_y','C_y'],
['A_y','C_y','D_y','B_y'],
['A_z','C_z','D_z','B_z']]

listOfInd=[]
for ind, sl in enumerate(myListOfList):
if len(sl) == len(myList) and [x.endswith(sl[0][-2:]) for x in sl].count(False) == 0:
tempList = zip(myList, sorted(sl))
allTrue = True
for el in tempList:
#print el[0]
if el[0][:-2] != el[1][:-2]:
allTrue = False

if(allTrue):
listOfInd.append(ind)

这确实给了我正确的输出:listOfInd = [1, 6, 7]

解释此代码的两个元素:

这会检查列表 sl 中的所有元素是否具有相同的后缀:

[x.endswith(sl[0][-2:]) for x in sl].count(False) == 0

这会检查字符串 el 除了后缀(字符串的最后两个元素)之外是否相同:

if el[0][:-2] != el[1][:-2]

所以我要做的是遍历myListOfList中的每个列表,如果该列表中的元素数量与myList中的元素数量以及该列表中的所有元素相同具有相同的后缀,我使用 myList 压缩此列表。然后我遍历这个压缩列表中的每个元素并比较字符串直到后缀。

代码可以工作,但是,它看起来效率很低,我想知道是否有一种更“Pythonic”的方法来做到这一点,而无需这么多循环。谁能想到一种更有效的方法来实现这一点?

最佳答案

创建一个前缀集,检查前缀集是否是子列表中每个元素的前缀的子集,如果是,则检查所有后缀是否相同。

st = {s[0] for s in myList}
l = []
for ind, sub in enumerate(myListOfList):
k = sub[0][-1]
if st.issubset(ch[0] for ch in sub) and all((ch[-1] == k for ch in sub)):
l.append(ind)
print(l)
[1, 6, 7]

如果您愿意,可以将其放入列表组合中:

inds = [ind for ind, sub in enumerate(myListOfList) if st.issubset(ch[0] for ch in sub)
and all(ch[-1] == sub[0][-1] for ch in sub)]

print(inds)
[1, 6, 7]

您还可以进行一些优化,如果任何 sub 的长度不等于 myList 的长度,我们就无法匹配:,这样我们就可以使用 all 来查看每个 sub 中的每个元素 [0] 是否是在集合中,因为这可能会快一点。

l = []
ln_m = len(myList)
for ind, sub in enumerate(myListOfList):
k = sub[0][-1]
if len(sub) == ln_m and all(ch[0] in st for ch in sub) and all(ch[-1] == k for ch in sub):
l.append(ind)

关于python - 比较字符串列表中各自元素的后缀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31104019/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com