[英]Whilst iterating through a list check that every 3 consecutive elements follow a pattern
我有一个元素列表,应该每3个连续元素遵循一个模式,但是一些数据丢失了,我想用" "
填充数据丢失的地方。
例如,对于下面的列表,我要检查从第一个元素开始的每个第三个元素都包含单词"start"
,从第二个元素开始的每个第三个元素都包含"/"
,最后从第三个元素开始的每个第三个元素都包含"/"
":"
所以这:
list = ["start1", "mid/1", "end:1", "start2", "end:2", "mid/3", "end:3"]
会变成这样:
list = ["start1", "mid/1", "end:1", "start2", " ", "end:2", " ", "mid/3", "end:3"]
我设法使用下面的代码打印出每个第3个元素和步骤编号,但是在实际插入" "
遇到了麻烦
data = ["start1", "mid/1", "end:1", "start2", "end:2", "mid/3", "end:3", "start4", "mid/4", "end:4", "start5", "end:5"]
for step, init_info in enumerate(data[:3:], 1):
for elem, info in enumerate(data[step-1::3], 1):
print(step, info)
返回:
(1, 'start1') (1, 'start2') (1, 'end:3') (1, 'end:4') (2, 'mid/1') (2, 'end:2') (2, 'start4') (2, 'start5') (3, 'end:1') (3, 'mid/3') (3, 'mid/4') (3, 'end:5')
您可以通过对源列表进行简单循环并进行一些检查来实现:
l = ["start1", "mid/1", "end:1", "start2", "end:2", "mid/3", "end:3"]
# defines which position must hold what thing in it to be not substituted
d = {0:"start", 1:"/", 2:":"}
# target list
k = []
# counts the insertions, to adjust dict lookup
inserted = 0
for idx,e in enumerate(l):
must_be_in_else_substitute = d.get( (idx+inserted) % 3)
if must_be_in_else_substitute in e:
k.append(e)
else:
inserted+=1
k.extend([" ",e])
print(k)
输出:
['start1', 'mid/1', 'end:1', 'start2', ' ', 'end:2', ' ', 'mid/3', 'end:3']
您可以按照@timgeb的建议使用生成器,因为大多数“规则”都已设置好,所以不知道它的可重用性。 这样做与上面的代码大致相同,只是更加懒惰:
l = ["start1", "mid/1", "end:1", "start2", "end:2", "mid/3", "end:3"]
def insert_something_if_at_pos_not_in(rules,data,tbi=" "):
"""No idea how to docstring this in a sensible way - lets say
it does what the OP described :o)"""
inserted=0
rule_max = max(rules.keys())+1
for idx,e in enumerate(data):
must_be_in = rules.get( (idx+inserted) % rule_max)
if must_be_in in e:
yield e
else:
yield " "
yield e
print( list(insert_something_if_at_pos_not_in({0:"start", 1:"/", 2:":"},l) ))
.get()方法允许您在未插入默认值的情况下放置默认值。 但这是字典的一种方法。 尝试将其与.append配对以创建您的列表
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.