我有一个生成Verilog代码的python 2.7脚本。我需要在字典中创建一个逗号分隔的键列表。例如,如果字典中的键是“ A”,“ B”和“ C”,则需要能够打印到生成的文件“ A,B,C”或“ B,A,C” ,或按键发出的任何顺序(我不在乎顺序)。有趣的是,我最后没有逗号,因此我需要确定要返回的第一个项目或最后一个项目,以便对它们中的一个进行不同的处理。
是否有一种清晰的“ Pythonic”方式来标识迭代项返回的第一个或最后一个项目?
与Looping over a dictionary without first and last element不同,我确实想要所有物品,并且不在乎退货订单。在该问题的答案中使用该方法将字典转换为列表,然后显式遍历所有项并以不同方式处理第一个或最后一个项,这似乎是一种很大的扭曲。
我当前正在使用的变通方法感觉很“ C-ish”:我在迭代之前将“ first_item”变量设置为True,然后在循环内进行测试,对第一项进行不同的操作,然后进行更改它为假。这可行,但不是特别优雅的解决方案:
# Generate the group enum declaration
fp.write('enum {')
first_item = True
for k,v in c.iteritems():
if first_item:
first_item = False
fp.write(k)
else:
fp.write(', ' + k)
fp.write('} group;\n')
我唯一想区分最后一项的技巧甚至更丑陋-将变量设置为len(dictionary),然后在iteritems循环的每个遍历中将其递减,并在达到1时做一些不同的事情。>
IMO的Uglier仍在将', ' + k
添加到每个键的字符串a中,然后删除前两个字符。
是否有任何建议比上面显示的解决方法更干净?
答案 0 :(得分:2)
您可以使用join
来避免整个问题。另外,由于不需要这些值,因此只能在键上进行迭代。
fp.write('enum {')
fp.write(', '.join(c.iterkeys()))
fp.write('} group;\n')