【发布时间】:2015-09-15 05:28:25
【问题描述】:
假设我有一个这样的列表
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's 长度不同,或者元素的第一部分与 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中的相同并且此列表中的所有元素具有相同的后缀,我zip这个以myList 列出。然后我遍历这个压缩列表中的每个元素并比较字符串直到后缀。
代码可以工作,但是,它看起来效率很低,我想知道是否有一种更“pythonic”的方式可以在没有这么多循环的情况下执行此操作。谁能想到一种更有效的方法来实现这一点?
【问题讨论】:
-
['A_y','B_y','C_z','D_z']和['A_x','D_k','B_x','C_k']是否被视为相等? -
@mescalinum:不,列表中的后缀必须相同。
标签: python performance list string-comparison