删除列表中字符串的所有扩展名

时间:2015-12-08 05:30:49

标签: python python-3.x dictionary

我有词典如:

s = "a,
b,
c,
d"
s.dump
# => "\"a,\\nb,\\nc,\\nd\"" 
s.dump[1...-1]
# => "a,\\nb,\\nc,\\nd" 

我正在尝试使程序可以找到列表中最短的子字符串(例如第一个中的GAA)并使用它来查找所有其他只是GAA扩展的条目(以GAA开头的字符串和只需要额外的字母)并删除它们。

我知道这里有很多关于如何从列表中删除项目的问题,但没有人帮助我解决这个问题。

2 个答案:

答案 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']}

注意:这也会保留最短字符串相对于其他字符串的位置。以防这是重要的。