【问题标题】:Transform a list to dict with tuple as key以元组为键将列表转换为字典
【发布时间】:2021-01-12 15:55:36
【问题描述】:

我想从列表中做 ['sw0005', 'sw0076', 'Gi1/2', 'sw0005', 'sw0076', 'Gi1/5'] 带有元组的字典,看起来像 {('sw0005','sw0076'):'Gi1/2', ('sw0005','sw0076'):'Gi1/5'} 在 python 中可以做到什么更好?

【问题讨论】:

  • 您的字典有两个相同的键。您还应该展示您尝试过的内容。

标签: python python-3.x list dictionary tuples


【解决方案1】:

您可以使用列表的iter 来获取下一个元素,然后使用next 之后的两个:

>>> lst = ['sw0005', 'sw0076', 'Gi1/2', 'sw0006', 'sw0076', 'Gi1/5']        
>>> it = iter(lst)                                                          
>>> {(a, next(it)): next(it) for a in it}                                   
{('sw0005', 'sw0076'): 'Gi1/2', ('sw0006', 'sw0076'): 'Gi1/5'}

注意:(a)我更改了列表,因此两个元组不相同; (b) 如果元素的数量不能被三整除,这将失败。

正如 cmets 中所述,这只适用于相当新的 Python 版本。或者,您可以将rangestep 和索引一起使用:

>>> {(lst[i], lst[i+1]): lst[i+2] for i in range(0, len(lst), 3)}
{('sw0005', 'sw0076'): 'Gi1/2', ('sw0006', 'sw0076'): 'Gi1/5'}

【讨论】:

  • 值得注意的是,此解决方案需要 Python3.5 及更高版本 - 希望每个人都已经是 - 其中字典评估顺序是固定的,因此它的键在值之前评估。 Python 的早期版本(3.4、2.7 等)会给出错误的输出:{('sw0005', 'Gi1/2'): 'sw0076', ('sw0006', 'Gi1/5'): 'sw0076'};因为值表达式在键表达式之前计算 (was a bug)。
  • @aneroid 感谢您的指出,添加了替代方案。
  • @aneroid 让你怀疑它是否应该是一个错误。诚然,表达式应该从左到右计算,但key: value 是表达式还是赋值?在赋值d[next(it)] = next(it) 中,RHS,即值确实会首先被评估。 (但key: value 的从左到右 更直观。)
  • 嗯,在字典理解的上下文中,它是一个表达式;或者更确切地说,它们是每个表达式。除非作业的 LHS,否则它应该是从左到右的。好吧,实际上,语句的每个部分从左到右,从最里面到最外面; =s 在 LHS 之前是 RHS。所以如果lst = range(0, 10); it = iter(lst) 那么这两个给出不同的dicts:{next(it): next(it) for _ in range(0, 5)} vs for _ in range(0, 5): d[next(it)] = next(it)。这可能看起来不一致,但只有一个表达,我认为这是正确的行为。
【解决方案2】:

我使可迭代的内容更具可读性

 list1=['sw0005', 'sw0076', 'Gi1/2', 'sw0005', 'sw0076', 'Gi1/5']

 queryable=iter(list1)

 mylist=[]
 for i in range(int(len(list1)/3)):
     mylist.append({(next(queryable),next(queryable)):next(queryable)})

 print(mylist)

【讨论】:

    猜你喜欢
    • 2013-04-01
    • 1970-01-01
    • 2020-05-09
    • 2010-09-20
    • 2017-06-07
    相关资源
    最近更新 更多