如何通过用户输入对字符串进行排序

时间:2018-05-29 19:48:04

标签: python-3.x

我正在尝试编写从输入读取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) 

2 个答案:

答案 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失败并返回其他值的键函数。