从python列表中删除循环子串

时间:2013-11-25 04:48:52

标签: python-2.7

我有一个如下所示的Python列表:

['IKW', 'IQW', 'IWK', 'IWQ', 'KIW', 'KLW', 'KWI', 'KWL', 'LKW', 'LQW', 'LWK', 'LWQ', 'QIW', 'QLW', 'QWI', 'QWL', 'WIK', 'WIQ', 'WKI', 'WKL', 'WLK', 'WLQ', 'WQI', 'WQL']

如果我们选择,说第二个元素IQW,我们会看到该列表中包含此项目的重复项,而不是立即注意到它。这是因为它是循环的。我的意思是以下是等价的。

IQWQWIWIQ

它也可能是倒退,也是重复,所以我想删除它。所以现在重复的列表是(与其中一个相反)

IQWQWIWIQWQIIWQQIW

基本上我希望IQW成为唯一剩下的人。 奖励积分,如果列表中剩余的那个按字母顺序排序。

我的方法是按字母顺序对整个列表进行排序:

`IQW`, `QWI`, `WIQ` , `WQI`, `IWQ`, `QIW` ->
`IQW`, `IQW`, `IQW`, `IQW`, `IQW` `IQW` 

然后删除重复项。 然而,这也会删除组合,例如我有ABCDCDAB。这些不一样,因为结尾只会遇到一次。但我的方法会将它们排序为ABCDABCD并删除一个。

我的代码:

print cur_list
sortedlist = list()
for i in range(len(cur_list)):
    sortedlist.append(''.join(map(str, sorted(cur_list[i]))))
sortedlist =  set(sortedlist)

2 个答案:

答案 0 :(得分:1)

L = ['IKW', 'IQW', 'IWK', 'IWQ', 'KIW', 'KLW', 'KWI', 'KWL', 'LKW', 'LQW', 'LWK', 'LWQ', 'QIW', 'QLW', 'QWI', 'QWL', 'WIK', 'WIQ', 'WKI', 'WKL', 'WLK', 'WLQ', 'WQI', 'WQL']

seen = set()
res = []
for item in L:
    c = item.index(min(item))
    item = item[c:] + item[:c]
    if item not in seen:
        seen.add(item)
        seen.add(item[0]+item[-1:0:-1])
        res.append(item)

print res

输出:

['IKW', 'IQW', 'KLW', 'LQW']

答案 1 :(得分:0)

以下是我编码的解决方案:如果有人有更好的算法,我会接受这个答案:

mylist = list()
for item in copy_of_cur:
    linear_peptide = item+item    
    mylist  = filter(lambda x: len(x) == 3 , subpeptides_linear(linear_peptide))
    for subitem in mylist:
        if subitem != item:
            if subitem in cur_list:
                cur_list.remove(subitem)