假设我有以下列表:[0, '12345678', 4, '02305678', 3, '39401830']
。
出于某种原因,我只需要对字符串进行排序,这意味着仅对字符串进行排序后的列表看起来像['02305678', '12345678', '39401830']
。
如何像以前一样将索引0, 4, 3
“插入”到每个字符串左侧的右侧?
答案 0 :(得分:2)
您可以在列表上使用.insert()方法。
a_list = ['02305678', '12345678', '39401830']
a_list.insert(0, 0)
a_list.insert(2, 4)
a_list.insert(4, 3)
返回
[0, '02305678', 4, '12345678', 3, '39401830']
因为a_list.insert(x,y)将元素y插入列表的索引x。
答案 1 :(得分:0)
查看python list.insert(..)
方法文档和示例。您可以使用函数在Python中的任何索引的列表中插入任何值。
list.insert(...)
方法values = [0, '12345678', 4, '02305678', 3, '39401830']
def sort(values, sorter=None):
if not sorter:
sorter = lambda values: sorted(values)
strings = {}
for i, v in enumerate(values):
if isinstance(v, str):
strings[i] = v
sorted_strings = sorter(strings.values())
for i in strings.keys():
values.pop(i)
values.insert(i, sorted_strings.pop(0))
return values
print('IN: {}'.format(values))
print('OUT: {}'.format(sort(values)))
输出
# python test123.py
IN: [0, '12345678', 4, '02305678', 3, '39401830']
OUT: [0, '02305678', 4, '12345678', 3, '39401830']
还有一个超级疯狂的例子。
IN: [0, '12345678', 4, '02305678', 3, '39401830', 0, 0, '213231', '12112', '111', 1, '11', '23', 0]
OUT: [0, '02305678', 4, '11', 3, '111', 0, 0, '12112', '12345678', '213231', 1, '23', '39401830', 0]
.pop & .insert
values = [0, '12345678', 4, '02305678', 3, '39401830']
def sort(values, sorter=None):
if not sorter:
sorter = lambda x: sorted(x)
strings = {i: v for i, v in enumerate(values) if isinstance(v, str)}
sorted_strings = sorter(strings.values())
for i, k in enumerate(strings.keys()):
values[k] = sorted_strings[i]
return values
print('IN: {}'.format(values))
print('OUT: {}'.format(sort(values)))
还支持自定义排序功能,以防万一
开个玩笑,别生气:-)
答案 2 :(得分:0)
如果只想进行一般的交错,则可以结合使用flatten / zip。
from more_itertools import flatten
example = [0, '12345678', 4, '02305678', 3, '39401830']
digits, strings = example[0::2], example[1::2]
list(flatten(zip(digits, sorted(strings))))
输出
[0, '02305678', 4, '12345678', 3, '39401830']
答案 3 :(得分:-1)
如果我理解的正确,您想使用字符串对整数值进行排序。
假设原始列表中的每个字符串值都有索引,您可以执行以下操作:
lst = [0, '12345678', 4, '02305678', 3, '39401830']
from itertools import chain
print([*chain(*sorted(zip(lst[::2], lst[1::2]), key=lambda k: k[1]))])
打印:
[4, '02305678', 0, '12345678', 3, '39401830']
编辑:
如果要在原始位置使用整数值:
print([*chain(*zip(lst[::2], sorted(lst[1::2])))])
打印:
[0, '02305678', 4, '12345678', 3, '39401830']
答案 4 :(得分:-1)
@Andrej Kesely的accepted answer假定整数和字符串始终成对出现。也就是说,如果列表如下,它将不会产生正确的输出:
mylist = [0, 8, 9, '12345678', 4, '02305679', '02305678', 3, '39401830']
这里是解决一般问题的一种解决方案,该问题仅对列表的一部分进行排序,而其余项保持原始顺序。
创建一个迭代器以迭代满足您条件的列表中的排序值
(在您的示例中,条件是该值是字符串)
cond = lambda x: isinstance(x, str)
sorted_matching_it = iter(sorted(x for x in mylist if cond(x)))
现在,根据条件,通过从此迭代器或原始列表中选择项目来构建最终列表:
new_list = [next(sorted_matching_it) if cond(x) else x for x in mylist]
print(new_list)
#[0, 8, 9, '02305678', 4, '02305679', '12345678', 3, '39401830']