将字符串长度与无序列表

时间:2015-06-06 16:36:16

标签: python

我有一个不同长度的数字和字符串列表。我想生成一个字典,将每个数字映射到具有该长度的字符串,如果它们没有一对,则丢弃数字和字符串。

py_list = ['1', '##', '2', '#', '3', '####', '4', '###', '5', '######']
py_dict = {'1': '#', '2': '##', '3': '###', '4': "####"}

这是我到目前为止所尝试的:

  1. 遍历列表以将数字分成新列表
  2. 遍历列表,将“#”字符串分隔为新列表
  3. 迭代新列表以构建字典
  4. 我知道这不是最有效的解决方案。有什么更好的方法呢?

3 个答案:

答案 0 :(得分:4)

您可以使用dictionary comprehensions作为

>>> { str(len(x)) : x for x in py_list if not x.isdigit() and str(len(x)) in py_list }
{'1': '#', '3': '###', '2': '##', '4': '####'}

答案 1 :(得分:2)

O(n)解决方案:

s=set(int(x) for x in py_list[::2]).intersection(len(x) for x in py_list[1::2])
d={str(x) : '#'*x  for x in s}
# {1: '#', 2: '##', 3: '###', 4: '####'}  

答案 2 :(得分:1)

您可以尝试以下方法:

py_list = ['1', '##', '2', '#', '3', '####', '4', '###', '5', '######']
h = lambda l: '#'*l
dict_with_matching_hashes = dict([(x, h(int(x))) for x in py_list if x.isdigit() and h(int(x)) in py_list])
print(dict_with_matching_hashes)

这会给你以下结果:

  

{' 2':' ##',' 1':'#',' 4&#39 ;:' ####',' 3':' ###'}