在Python中对具有两种不同类型的列表进行排序

2024-09-30 14:37:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一张这样的单子。[0,0,0,0,0,'entrya',5,'entryb',10,'anoterentry',7,'entry',1,'entryd',30,….,0,0,0,0]

等等,我觉得这个想法很清楚。我现在的问题是,我想在与字符串相关联的数字之后对整个列表进行排序。结果是这样的。['entry',1,'entrya',5,'anoterentry',7,'entryb',10,'entryd',30,。。。。0,0,0,0,0](或者反过来说,哪一种更好。)

我的问题很明显,相邻的词条必须放在一起,而字典不允许进行这种练习。你知道吗

有人知道怎么做吗?你知道吗

非常感谢!你知道吗


Tags: 字符串列表字典排序数字单子entry词条
3条回答

我不太确定我是否了解你最初的清单是如何构建的。如果我们称之为x,并且每个偶数项(0,2,…)都是一个字符串,每个奇数项(1,3,…)都是与前面的字符串相关联的数字,则可以将其转换为元组列表,如下所示:

y = zip(x[0::2], x[1::2])

然后可以对元组y的列表进行排序:

y.sort(key=lambda t: t[1])

这将产生:

[(0, 0),
 (0, 0),
 (0, 0),
 (0, 0),
 (0, 0),
 (0, 0),
 ('entry', 1),
 ('entrya', 5),
 ('anotherentry', 7),
 ('entryb', 10),
 ('entryd', 30)]

这有用吗?你知道吗

编辑:

要再次将其展平为列表:

z = [entry for tup in y for entry in tup]

这似乎是一个非常奇怪的数据集,但假设您真的需要它:
如果删除开头和结尾的0,则排序相当容易:

>>> l = ['entrya', 5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30]
>>> [b for a in sorted(zip(*[iter(l)]*2), key=lambda x: x[1]) for b in a]
['entry', 1, 'entrya', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30

所以假设你没有0作为你的另一个entries的值,那么你可以把它当作两种情况来处理,把所有不是零的东西成对地排序,然后把所有的零加回去。你知道吗

>>> l = [0,0,0,0,0,'entrya',5, 'entryb', 10, 'anotherentry', 7, 'entry', 1, 'entryd', 30, 0,0,0,0,0]
>>> pairs = [b for a in sorted(zip(*[iter(filter(lambda x: x!=0, l))]*2), key=lambda x: x[1]) for b in a]
>>> zeros = list(filter(lambda x: x == 0, l))
>>> pairs + zeros
['entry', 1, 'entrya', 5, 'anotherentry', 7, 'entryb', 10, 'entryd', 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]

我的方法是先将列表中的元素压缩为元组,如下所示:

[('null', 0), ('null', 0), ('null', 0), ('entrya', 5), ('entryb', 10), ('anotherentry', 7), ...]

之后,可以按第二个元素对元素进行排序。你知道吗

ls = [0, 0, 0, 0, 0, 'entrya', 5, 'entryb', 10, 'anotherentry', 7, 
     'entry', 1, 'entryd', 30, 0, 0, 0, 0, 0, 0]

ls_zip_elem = []
for x1, x2 in zip(ls, ls[1:]):
    if x1 == 0:
        ls_zip_elem.append(('null', x1))
    elif not str(x1).isdigit():
        ls_zip_elem.append((x1, x2))
    else:
        pass
ls_zip_elem_sorted = sorted(ls_zip_elem, key=lambda x: x[1]) # sorted

# put the list back
ls_sorted = []
for x1, x2 in ls_zip_elem_sorted:
    if x1 == 'null':
        ls_sorted.append(x2)
    else:
        ls_sorted.extend([x1, x2])

# output
# [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 'entry', 1, 'entrya', 5, 'anotherentry', 7, 
# 'entryb', 10, 'entryd', 30]

相关问题 更多 >