我被要求对这个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()。
我不确定如何对它进行排序或做什么。
谢谢
答案 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']