对具有不同数据类型的python列表进行排序

时间:2019-09-14 01:24:53

标签: python python-3.x

我被要求对这个python列表进行排序,然后以相反的顺序进行排序。

#[derive(Debug, Eq, PartialEq, Hash)]
struct CacheItem(Rc<String>);

impl Borrow<str> for CacheItem {
    fn borrow(&self) -> &str {
        &self.0
    }
}

impl Borrow<String> for CacheItem {
    fn borrow(&self) -> &String {
        &self.0
    }
}

impl Borrow<Rc<String>> for CacheItem {
    fn borrow(&self) -> &Rc<String> {
        &self.0
    }
}

let string_cache: HashSet<CacheItem> = [rc_string.clone()].iter().cloned().map(CacheItem).collect();
assert!(string_cache.contains(&rc_string));
assert!(string_cache.contains(&string));
assert!(string_cache.contains(input));

我的问题是,如果其中有字符串,该如何排序?我的假设是输出将如下所示:

lst = [4,7,3,7,2,1,"Three",34,8]

然后我将在此上使用reverse()。

我不确定如何对它进行排序或做什么。

谢谢

2 个答案:

答案 0 :(得分:2)

尽管我认为这个问题从哲学上讲应该解决这种情况下的含义,但我还是想尝试一下。

对于这种特定情况,您可以创建函数或字典以将单词翻译为数字,也可以使用__do_nothing: 44e2: ret ;44e4 .strings: 44e4: "Enter the password to continue" 4503: "Invalid password; try again." 4520: "Access Granted!" 中的word2number之类的库。

例如:

PyPi
  

结果:['-3.5',-2、1、2、2.6、3,'三',4,'5',7、7、8、34]

使用排序中的函数将单词转换为数字,尽管如果单词不在lst = [4,7,3,7,2.6,2,-2,1,"Three",34,8, "5", "-3.5"] def numerate(x): if isinstance(x, (int, float)): return x try: return int(x) except ValueError: pass try: return float(x) except: pass try: return trans[x.lower()] except KeyError: raise ValueError(f"{x} is not a number") print(sorted(lst, key=numerate)) 词典中也会失败。使用word2number代替trans查找,例如(注意:未测试)

trans

当然会(很多)更一般。

答案 1 :(得分:2)

这应该适用于任何字数(三,二十,七十九等)。

您需要安装word2number库。

pip install word2number

解决方案

import numpy as np
from word2number import w2n
def get_number(x):
    # pip install word2number
    # from word2number import w2n
    if isinstance(x,str):
        x = w2n.word_to_num(x)
    return x

lst = [4,7,3,7,2,1,"Three",34,8]  
data_nums = [lst[y] for y in np.array([get_number(x) for x in lst]).argsort()]

输出

[1, 2, 3, 'Three', 4, 7, 7, 8, 34]

另一种可能性

如果要以单词等效表示形式来表示先前排序的值(在data_nums中)?

您可能需要安装num2words库:pip install num2words

import num2words as n2w
def get_word(n, titlecase = True):
    # pip install num2words
    # import num2words as n2w
    if not isinstance(n,str):
        w = n2w.num2words(n)        
    else:
        w = n
    if titlecase and isinstance(w,str):
        w = w.title()
    return w

data_words = [get_word(x) for x in data_nums]
data_words

输出:

['One',
 'Two',
 'Three',
 'Three',
 'Four',
 'Seven',
 'Seven',
 'Eight',
 'Thirty-Four']