如何在Python中对列表列表排序和合并连续元素

如何在Python中对列表列表排序和合并连续元素,python,itertools,Python,Itertools,我有这样一个列表: ['lion', '23', '35'] ['lion', '24', '68'] ['elephant', '23', '34'] ['monkey', '4', '20'] ['monkey', '5', '25'] ['monkey','28', '90'] ['lion', '33', '2'] ['lion', '23-24', '35-68'] ['lion', '33', '2'] ['elephant', '23', '34'] ['monkey',

我有这样一个列表:

['lion', '23', '35'] 
['lion', '24', '68'] 
['elephant', '23', '34']
['monkey', '4', '20'] 
['monkey', '5', '25']
['monkey','28', '90']
['lion', '33', '2']
['lion', '23-24', '35-68']
['lion', '33', '2']
['elephant', '23', '34']
['monkey', '4-5', '20-25']
['monkey', '28', '90']
我想对它们进行分类,并将它们与具有连续值(23-34)的同一类型动物进行合并,并将其与其相邻的值(例如,狮子为35-68)进行合并,如下所示:

['lion', '23', '35'] 
['lion', '24', '68'] 
['elephant', '23', '34']
['monkey', '4', '20'] 
['monkey', '5', '25']
['monkey','28', '90']
['lion', '33', '2']
['lion', '23-24', '35-68']
['lion', '33', '2']
['elephant', '23', '34']
['monkey', '4-5', '20-25']
['monkey', '28', '90']
请注意,lion和monkey的连续值用破折号及其旁边的序列合并和分隔。那些不是连续的仍然是单独的:狮子33和猴子28

我用itertools和groupby以及labda排序尝试了一些代码,但都没有用

比如说

sort(key=lambda元素:(元素[0],元素[1]))

按动物名称和连续数字对它们进行排序,但我不知道如何合并它们

我想要的是按动物名称的字母顺序排列它们,合并那些具有连续第二个值的,并用该输出创建一个新列表


有什么想法吗?

您可以尝试类似的方法,并从以下代码中得到提示:

data=[['lion', '23', '35'],
['lion', '24', '68'],
['elephant', '23', '34'],
['monkey', '4', '20'],
['monkey', '5' , '25'],
['monkey','28', '90'],
['lion', '33', '2']]

from itertools import groupby
from itertools import combinations
final_=[]
for i,j in groupby(sorted(data),key=lambda x:x[0]):
    final_.append(list(j))

final__=[]
check=[]
for mn in final_:
    if len(mn)==1:
        final__.append(mn)
    for k in combinations(mn,r=2):

        if abs(int(k[0][1])-int(k[1][1]))==1:
            check.extend(k)
            final__.append([k[0][0],"{}-{}".format(k[0][1],k[1][1]),"{}-{}".format(k[0][2],k[1][2])])
        else:
            if k[0] not in check:
                if k[0] not in final__:
                    final__.append(k[0])
            elif k[1] not in check:
                if k[1] not in final__:
                    final__.append(k[1])

print(final__)
输出:

[[['elephant', '23', '34']], ['lion', '23-24', '35-68'], ['lion', '33', '2'], ['monkey', '28', '90'], ['monkey', '4-5', '20-25']]

欢迎光临,看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的程序员编写代码,但他们通常只在海报已经试图自己解决问题时才提供帮助。演示这项工作的一个好方法是包括您迄今为止编写的代码、示例输入(如果有)、预期输出和实际获得的输出(控制台输出、回溯等)。你提供的细节越多,你可能得到的答案就越多。检查and。也许可以尝试使用一个简单的for循环,将其附加到一个新的“合并列表”中。在循环中,您向前看并比较下一个索引的键,如果它们匹配,则进行适当的合并。另外,我假设数字是字符串而不是纯整数?否则我看不出你会怎么把它们合并成这样也同意@moingrawr,因此答案有限。@moingrawr并不是真的要求为我编写代码。我已经尝试过基本的lambda,比如:strings.sort(key=lambda元素:(e[0],e[1]),它们已经正确地对它们进行了排序,但是我不知道如何在它们被排序后使用连接来合并它们。旧的itertools文档有一个对连续项进行分组的方法。这是有插图的。@mistervela重点是,展示你尝试过的东西,即使它不起作用。这表明你在解决自己的问题上付出了努力,也许有人能在你所做的基础上纠正你做错的事情。哇,非常感谢。我决不会想出这样的主意。