首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >是否按键对列表进行排序,并以与第一个列表相同的方式对另一个列表进行排序?

是否按键对列表进行排序,并以与第一个列表相同的方式对另一个列表进行排序?
EN

Stack Overflow用户
提问于 2019-02-22 03:46:16
回答 4查看 82关注 0票数 2

例如,有三个列表:

代码语言:javascript
复制
unsorted_key = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p']
sorted_key = ['e', 'i', 'o', 'p', 'q', 'r', 't', 'u', 'w', 'y']
ciphertext = [
              ['u', 't', 'x', 'e'],
              ['p', 'r', 'k', 'p'],
              ['v', 'n', 'x', 'a'],
              ['n', 'h', 'e', 'x'],
              ['x', 'h', 'm', 's'],
              ['l', 'x', 'c', 'x'],
              ['x', 'c', 'y', 'a'],
              ['t', 'u', 'o', 'x'],
              ['e', 'r', 'm', 'e'],
              ['y', 'y', 'e', 'x']
             ]

是否可以采用sorted_key的顺序并将其排序到unsorted_key中,以及采用密文的顺序并以相同的方式对其进行排序?

将'q‘从sorted_key4移至sorted_key时,应将ciphertext4移至密文。

  • 这三个列表的长度始终相等。
  • sorted_key和unsorted_key永远不会有重复的元素。
  • sorted_key将始终是unsorted_key的排序版本。

我一直在考虑这个问题,我能想到的唯一方法就是使用一个助手函数,从unsorted_key的顺序动态生成并返回一个lambda函数,然后使用类似这样的方法:

代码语言:javascript
复制
sorted_key, ciphertext = (list(i) for i in zip(*sorted(zip(sorted_key, ciphertext), key=generate(unsorted_key))))

但我真的不知道zip()或lambda函数是如何工作的,也不知道如何将定制的排序顺序变成一个排序顺序,或者是否可以返回一个排序顺序在sorted()中使用。我似乎真的不能理解这个问题,所以任何帮助都将不胜感激!

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-22 04:08:37

在线性时间内解决这个问题的一个有效方法是创建一个key映射到sorted_key索引的dict,然后创建一个映射dict,根据相同的key将unsorted_key的索引映射到sorted_key的索引,这样您就可以在ciphertext的长度范围内迭代索引,按照映射顺序生成一个列表:

代码语言:javascript
复制
order = dict(map(reversed, enumerate(sorted_key)))
mapping = {i: order[k] for i, k in enumerate(unsorted_key)}
print([ciphertext[mapping[i]] for i in range(len(ciphertext))])

这将输出以下内容:

代码语言:javascript
复制
[['x', 'h', 'm', 's'], ['e', 'r', 'm', 'e'], ['u', 't', 'x', 'e'], ['l', 'x', 'c', 'x'], ['x', 'c', 'y', 'a'], ['y', 'y', 'e', 'x'], ['t', 'u', 'o', 'x'], ['p', 'r', 'k', 'p'], ['v', 'n', 'x', 'a'], ['n', 'h', 'e', 'x']]
票数 1
EN

Stack Overflow用户

发布于 2019-02-22 04:06:51

我不确定我是不是明白了,但是...

首先确定移动(可以是相反的,我不清楚it0s ):

代码语言:javascript
复制
moves = [ [i, sorted_key.index(c)] for i, c in enumerate(unsorted_key) ]
#=> [[0, 4], [1, 8], [2, 0], [3, 5], [4, 6], [5, 9], [6, 7], [7, 1], [8, 2], [9, 3]]

也许可以在[i, sorted_key.index(c)]中交换元素。

将移动应用于接收器(res):

代码语言:javascript
复制
res = [ None for _ in range(len(ciphertext))]
for a, b in moves:
  res[a] = ciphertext[b]

所以输出应该是:

代码语言:javascript
复制
for line in res:
  print(line)

# ['x', 'h', 'm', 's']
# ['e', 'r', 'm', 'e']
# ['u', 't', 'x', 'e']
# ['l', 'x', 'c', 'x']
# ['x', 'c', 'y', 'a']
# ['y', 'y', 'e', 'x']
# ['t', 'u', 'o', 'x']
# ['p', 'r', 'k', 'p']
# ['v', 'n', 'x', 'a']
# ['n', 'h', 'e', 'x']

用于测试执行时间的

代码语言:javascript
复制
import timeit, functools

def custom_sort(ciphertext, sorted_key, unsorted_key):
  return [ ciphertext[b] for _, b in [ [i, sorted_key.index(c)] for i, c in enumerate(unsorted_key) ] ]


custom_sort = timeit.Timer(functools.partial(custom_sort, ciphertext, sorted_key, unsorted_key))

print(custom_sort.timeit(20000))
票数 1
EN

Stack Overflow用户

发布于 2019-02-22 04:19:38

具有自定义键的内置sorted可以为您完成此操作:

代码语言:javascript
复制
sorted(ciphertext, key=lambda x: unsorted_key.index(sorted_key[ciphertext.index(x)]))

输出:

代码语言:javascript
复制
[['x', 'h', 'm', 's'], 
 ['e', 'r', 'm', 'e'], 
 ['u', 't', 'x', 'e'], 
 ['l', 'x', 'c', 'x'], 
 ['x', 'c', 'y', 'a'], 
 ['y', 'y', 'e', 'x'], 
 ['t', 'u', 'o', 'x'], 
 ['p', 'r', 'k', 'p'], 
 ['v', 'n', 'x', 'a'], 
 ['n', 'h', 'e', 'x']]

lambda基本上归结为:

  1. 查找当前索引
  2. sorted_key
  3. 中查找当前索引值的值在unsorted_key中查找sorted_key值的索引
  4. 排序

我不清楚的一件事是,如果最终结果与unsorted_key相同,为什么还要对sorted_key进行“排序”?如果是这样,那么sorted_key = unsorted_key[:]就足够简单了。但是如果你真的需要对sorted_key进行排序,你可以这样做(这实际上会使lambda更简单):

代码语言:javascript
复制
ciphertext, sorted_key = map(list, zip(*sorted(zip(ciphertext, sorted_key), key=lambda x: unsorted_key.index(x[1]))))

ciphertext
[['x', 'h', 'm', 's'], 
 ['e', 'r', 'm', 'e'], 
 ['u', 't', 'x', 'e'], 
 ['l', 'x', 'c', 'x'], 
 ['x', 'c', 'y', 'a'], 
 ['y', 'y', 'e', 'x'], 
 ['t', 'u', 'o', 'x'], 
 ['p', 'r', 'k', 'p'], 
 ['v', 'n', 'x', 'a'], 
 ['n', 'h', 'e', 'x']]

sorted_key
['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p']
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54815079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档