我正在尝试编写从输入读取2行的程序,第一行是字母顺序,第二行是您要使用该顺序排序的字符串。
e.g
输入行1 - abcdefghijklmnopqrstuvwxyz
输入行2 - cyxbza
输出 - abcxyz
输入第1行 - zyxwvutsrqponmlkjihgfedcba
输入第2行 - cyxbza
输出 - zyxcba
有人可以帮忙吗?
var1= input("Enter Alphabate in Order")
var2= input("Enter Strings Randomly")
if var1==("zyxwvutsrqponmlkjihgfedcba"):
result=var2.sort(reverse=True)
else:
result=''.join (sorted(var2))
print(result)
答案 0 :(得分:1)
您可以使用基于给定键内“待排序字符”的位置(或缺少)的排序键来完成此操作:
var1 = input("Enter key to sort by - first comes first when sorted")
var2 = input("Enter Strings Randomly")
# if character in var1 (your key) use that position to sort, else
# put it to the end (position == lenght of key == after all key-chars)
r = ''.join(sorted(var2, key = lambda x: len(var1) if x not in var1 else var1.find(x)))
print(r)
输入:
# key:
khbatjm
# data:
abcdefghijklmnoipq
输出:
khbajmcdefgilnoipq
它将按照您的密钥的顺序排序,并且任何不包含的字符将按原始顺序添加到订购部分的末尾。
这种方法不是最理想的,因为每个角色的位置都没有被缓存,而是每次都会再次搜索 - 将它作为dict存储会更好/更快 - 但它很容易理解。奖金是:它能够应付非钥匙的角色。
字典查对优化:
# inpired by Patrick Haugh answer
posInKey = {ch:pos for pos,ch in enumerate(var1)}
r = ''.join(sorted(var2, key = lambda x: posInKey.get(x, len(var1))))
答案 1 :(得分:1)
这是一个示例,其中我们有一个函数接受字母并返回一个函数,该函数根据该字母表对字符串进行排序,使用key function
def encoder(alphabet):
mapping = {x: i for (i, x) in enumerate(alphabet)}
def encode(s):
return ''.join(sorted(s, key=mapping.get))
return encode
encode = encoder("zyxwvutsrqponmlkjihgfedcba")
encode("cyxbza")
# 'zyxcba'
请注意,这将无法将输入中不存在的字符放置到encoder
。如果要添加该功能,则必须编写一个能够捕获mapping.get
失败并返回其他值的键函数。