Python列表按所需顺序重新排列元素

2024-09-30 02:34:47 发布

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

我的主列表有44个名称作为元素。我想按特定的顺序重新排列它们。我在这里举一个例子。请注意,我的实际列表中的元素是一些技术名称。与我在这里所说的毫无关系

main_list = ['one','two','five','six',.................'twentyone','three','four','seven','eight',.....,'fortyfour']

我想重新排列一下名单。我不知道如何进行。但是我的预期输出应该是这样的 预期产出:

main_list = ['one','two','three','four','five','six','seven','eight'.................'twentyone',,.....,'fortyfour']

Tags: 名称元素列表mainonelistthreefour
3条回答

使用类似的东西(这只是我在Google上找到的第一个将数字的英文表示形式转换为整数值的东西;您使用的任何东西都需要能够将实际数据转换为可排序的东西):https://pypi.org/project/word2number/

from word2number import w2n

main_list.sort(key=w2n.word_to_num)

或者根据您的数据提出您自己的低俗版本。以您为例,您可以执行以下操作:

number_words = {
    'one': 1,
    'two': 2,
    'three': 3,
    'four': 4,
    'five': 5,
    'six': 6,
    'seven': 7,
    'eight': 8,
    'twenty': 20,
    'forty': 40,
    'sixty': 60,
}
def word_to_number(word: str) -> int:
    if word in number_words:
        return number_words[word]
    # Try chomping each number out of the word.
    for n in number_words:
        if word.endswith(n):
            return number_words[n] + word_to_number(word[:-len(n)])
    raise ValueError(f"I don't know what number '{word}' is!")
>>> main_list
['one', 'two', 'sixtyfour', 'five', 'six', 'twentyone', 'three', 'four', 'seven', 'eight', 'fortyfour']
>>> sorted(main_list, key=word_to_number)
['one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'twentyone', 'fortyfour', 'sixtyfour']

看起来您想按数字顺序对数字字进行排序。但是你上面的例子有一些格式不好的单词需要修改,比如twentyone和fortyfour。这是解决问题的一种方法

from word2number import w2n

main_list = ['one', 'two', 'five', 'six', 'twentyone', 'three', 'four', 'seven', 'eight', 'fortyfour']

VALID = ['zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', 'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen']

TENS = ['twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety']

renamed = []

for item in main_list:
    if item in VALID or item in TENS:
        renamed.append(w2n.word_to_num(item))
    else:
       for num in TENS:
           one = item.split(num)[-1] 
           if one in VALID:
               renamed.append(w2n.word_to_num(f'{num} {one}'))

输出

>>>sorted(renamed)
[1, 2, 3, 4, 5, 6, 7, 8, 21, 44]

您可以使用字典作为排序键:

sort_keys = {
    'one': 1,
    'two': 2,
    'three': 3,
    'ten': 10,
    'twenty': 20,
}
main_list = ['twenty', 'one', 'three', 'ten', 'two']
main_list.sort(key=lambda i: sort_keys[i])
print(main_list)

输出:

['one', 'two', 'three', 'ten', 'twenty']

相关问题 更多 >

    热门问题