列表操作-在列表中添加值

时间:2019-12-11 22:04:36

标签: python

假设我有以下列表:[0, '12345678', 4, '02305678', 3, '39401830']。 出于某种原因,我只需要对字符串进行排序,这意味着仅对字符串进行排序后的列表看起来像['02305678', '12345678', '39401830']

如何像以前一样将索引0, 4, 3“插入”到每个字符串左侧的右侧?

5 个答案:

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