我有一个如下所示的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
,我们会看到该列表中包含此项目的重复项,而不是立即注意到它。这是因为它是循环的。我的意思是以下是等价的。
IQW
,QWI
,WIQ
它也可能是倒退,也是重复,所以我想删除它。所以现在重复的列表是(与其中一个相反)
IQW
,QWI
,WIQ
,WQI
,IWQ
,QIW
基本上我希望IQW
成为唯一剩下的人。
奖励积分,如果列表中剩余的那个按字母顺序排序。
我的方法是按字母顺序对整个列表进行排序:
`IQW`, `QWI`, `WIQ` , `WQI`, `IWQ`, `QIW` ->
`IQW`, `IQW`, `IQW`, `IQW`, `IQW` `IQW`
然后删除重复项。
然而,这也会删除组合,例如我有ABCD
和CDAB
。这些不一样,因为结尾只会遇到一次。但我的方法会将它们排序为ABCD
和ABCD
并删除一个。
我的代码:
print cur_list
sortedlist = list()
for i in range(len(cur_list)):
sortedlist.append(''.join(map(str, sorted(cur_list[i]))))
sortedlist = set(sortedlist)
答案 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)