我有词典如:
s = "a,
b,
c,
d"
s.dump
# => "\"a,\\nb,\\nc,\\nd\""
s.dump[1...-1]
# => "a,\\nb,\\nc,\\nd"
我正在尝试使程序可以找到列表中最短的子字符串(例如第一个中的GAA)并使用它来查找所有其他只是GAA扩展的条目(以GAA开头的字符串和只需要额外的字母)并删除它们。
我知道这里有很多关于如何从列表中删除项目的问题,但没有人帮助我解决这个问题。
答案 0 :(得分:4)
>>> dictionary={ '1': ['GAA', 'GAAA', 'GAAAA', 'GAAAAA', 'GAAAAAG', 'GAAAAAGU',
'GAAAAAGUA', 'GAAAAAGUAU', 'GAAAAAGUAUG', 'GAAAAAGUAUGC',
'GAAAAAGUAUGCA', 'GAAAAAGUAUGCAA', 'GAAAAAGUAUGCAAG',
'GAAAAAGUAUGCAAGA', 'GAAAAAGUAUGCAAGAA', 'GAAAAAGUAUGCAAGAAC',
'RTRSRS','GAG', 'GAGA', 'GAGAG', 'GAGAGA', 'GAGAGAG', 'GAGAGAGA',
'GAGAGAGAC', 'GAGAGAGACA', 'GAGAGAGACAU', 'GAGAGAGACAUA',
'GAGAGAGACAUAG', 'GAGAGAGACAUAGA', 'GAGAGAGACAUAGAG',
'GAGAGAGACAUAGAGG']}
>>> new_dict = {}
>>> for i in dictionary:
l = len(min(dictionary[i], key=len))
m = [x for x in dictionary[i] if len(x)==l]
temp = []
temp.extend(m)
for k in dictionary[i]:
if not any(map(lambda j: k.startswith(j), m)):
temp.append(k)
new_dict[i] = temp
>>> print(new_dict)
# {'1': ['GAA', 'GAG', 'RTRSRS']}
答案 1 :(得分:2)
您的样本数据并不是很好。所有其他条目都以最短的字符串开头。因此,所有都将被删除。这是一个具有不同条目的较短版本:
data = {'1' : ['GAA', 'xxxxxxx', 'GAAA', 'GAAAA', 'GAAAAA'],
'2' : ['GAG', 'yyyyyyyy', 'GAGA', 'GAGAG', 'GAGAGA'],
'3' : ['GUC', 'zzzzzz', 'GUCU', 'GUCUU', 'GUCUUU']}
现在:
res = {}
for key, value in data.items():
shortest = min(value, key=len)
res[key] = [entry for entry in value if not entry.startswith(shortest)
or entry == shortest]
>>> res
{'1': ['GAA', 'xxxxxxx'], '2': ['GAG', 'yyyyyyyy'], '3': ['GUC', 'zzzzzz']}
注意:这也会保留最短字符串相对于其他字符串的位置。以防这是重要的。