Python一键两值字典循环问题及PySpark环境下的修正需求
问题分析与解决方案
首先看你遇到的问题:代码输出里出现单个字符,是因为错误地嵌套遍历了字典值的列表,把每个字符串当成可迭代对象取索引,导致拿到的是字符串的单个字符,而非整个字符串元素。
为什么会出错?
你的字典每个值是包含两个字符串的列表,比如['SERIAL_NUMBER :: (\w+)','number'],但原代码里的内层循环for v1 in v会逐个取出这两个字符串,然后v1[0]、v1[1]取的是字符串的第0、第1个字符,这就是输出里出现'S'、'W'的原因。
关于列表 vs 字典的选择
你的需求是每个键对应两个有序的值,且需要通过索引访问,用列表完全合适——列表天然有序,通过索引[0]、[1]访问直接符合你的要求;如果用字典(比如{'pattern': '...', 'label': '...'})虽然可读性更好,但不符合你“仅通过索引引用”的要求,所以列表是更优选择。
修正后的代码
dic = { '%serial_number%': ['SERIAL_NUMBER :: (\w+)', 'number'], '%sw_version%': ['SW_VERSION :: HR6400 ([\d\.\-]+)', 'ver'] } def match_regex(text): # 每个键仅遍历一次,不需要内层循环 for k, v in dic.iteritems(): # 直接通过索引取列表里的两个元素,按顺序使用 print(text, k, text, v[0], v[1]) match_regex(df.value)
效果说明
修改后,每个键只会被遍历一次,每次循环内直接通过索引v[0]、v[1]拿到对应位置的两个值,输出就会和你期望的一致:
(Column<value>, '%serial_number%', Column<value>, 'SERIAL_NUMBER :: (\w+)', 'number') (Column<value>, '%sw_version%', Column<value>, 'SW_VERSION :: HR6400 ([\d\.\-]+)', 'ver')
内容的提问来源于stack exchange,提问作者PR102012
相关产品推荐
相关产品推荐

