我试图以特定的方式对字符串的单词进行排序:在我的代码下面,输出是" MNWdeorwy" 但我希望它是 " deMNorWwy" (所以我需要保留订购的字母,尽管上面是o小写) 你能帮我理解我错在哪里,为什么?谢谢
wrd = "MyNewWord"
def order_word(s):
if s == "":
return "Invalid String!"
else:
c = sorted(s)
d = ''.join(sorted(c))
return d
print order_word(wrd)
我想确切地说我的问题与以下内容不同:How to sort the letters in a string alphabetically in Python:事实上,链接中给出的答案并没有考虑字符串中大写和小写的区别。
答案 0 :(得分:9)
1 1
12 12
123 123
1234 1,234
12345 12,345
123456 123,456
1234567 1,234,567
12345678 12,345,678
123456789 123,456,789
1234567890 1,234,567,890
根据每个角色的序数进行排序。大写字母的序数低于所有小写字母。如果您想要不同的行为,则需要定义自己的密钥:
sorted()
这样,c = sorted(s, key=lambda c: (c.lower(), c.islower()))
将按c
排序,('c', 1)
按C
排序。两者都来自('c', 0)
或('d', ...)
等,但首都('e', ...)
早于(低于)小写C
。
顺便说一下,您不应该说c
因为d = "".join(sorted(c))
已经排序了。只需c
答案 1 :(得分:2)
如果我理解了您的要求,您需要对字符串进行排序
这可以实现,例如,
In [44]: a = 'zWea'
In [45]: sorted(a,key=lambda c:c.upper())
Out[45]: ['a', 'e', 'W', 'z']
In [46]:
这是有效的,因为您在比较过程中会瞬间转换个别个字符。
忘记提及,你可以在你的字符串中混合使用非字母字符,但是在大写和小写字母字符之间放置一些字符(例如^
插入符号),所以你得到的取决于使用.lower()
或.upper()
字符串方法,
In [56]: sorted('abCD^',key=lambda c:c.lower())
Out[56]: ['^', 'a', 'b', 'C', 'D']
In [57]: sorted('abCD^',key=lambda c:c.upper())
Out[57]: ['a', 'b', 'C', 'D', '^']
In [58]:
答案 2 :(得分:1)
您也可以尝试这样
$results= \DB::table('groups as b')
->join('group_types as bt', function($join) {
$join->on('bt.id', '=', 'b.type_id')
->where('b.owner_id', '<>', 3);
})
->join('group_users as bu', function($join) {
$join->on('b.id', '=', 'bu.group_id')
->where('bu.status', '=', 'active');
})
->select('b.name','bt.name')
->groupBy('b.name, bt.name')
->get();
输出:
import re
def natural_sort(wrd):
convert = lambda text: int(text) if text.isdigit() else text.lower()
final = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ]
return ''.join(sorted(wrd, key = final))
OR
你可以在名为natsort
的PyPI上为第三方库做这件事