【发布时间】:2017-03-31 00:22:51
【问题描述】:
我有一个多行字符串如下:
mystr = """
ACTIVE 3/1.1
IDLE 3/1.1
IDLE 3/1.2
IDLE 3/1.2
ACTIVE 3/1.3
IDLE 3/1.3
ACTIVE 3/1.4
IDLE 3/1.4
ACTIVE 3/1.5
ACTIVE 3/1.6
IDLE 3/1.6
ACTIVE 3/1.7
IDLE 3/1.7
ACTIVE 3/1.8
IDLE 3/1.8
ACTIVE 3/1.9
IDLE 3/1.9
IDLE 3/1.10
"""
或者用一个列表,它会是:
mylist = ['ACTIVE 3/1.1 ', 'IDLE 3/1.1 ', 'IDLE 3/1.2 ', 'IDLE 3/1.2 ', 'ACTIVE 3/1.3 ', 'IDLE 3/1.3 ', 'ACTIVE 3/1.4 ', 'IDLE 3/1.4 ', 'ACTIVE 3/1.5 ', 'ACTIVE 3/1.6 ', 'IDLE 3/1.6 ', 'ACTIVE 3/1.7 ', 'IDLE 3/1.7 ', 'ACTIVE 3/1.8 ', 'IDLE 3/1.8 ', 'ACTIVE 3/1.9 ', 'IDLE 3/1.9 ', 'IDLE 3/1.10 ']
我的目标是……
对于每一对“x/y.z”,例如 3/1.1 或 3/1.2 等,都应该有一个匹配的 ACTIVE 和 IDLE 对。
如果没有“ACTIVE”或“IDLE”配对,则检查配对是否都显示为 IDLE。如果是,请将其退回。 如果没有对,那么无论它显示为 ACTIVE 还是 IDLE,都返回该值。
我通过执行以下操作使其工作:
此 var 用于与 x/y.z 的某些值进行比较,其中“z”可以是 1 到 10 之间的任何值。但是,配对只匹配“x/y”。部分:
lc = ['3/1.', '3/2.', '3/3.', '3/7.', '3/8.', '4/1.', '4/5.', '4/6.', '4/7.', '5/3.', '5/4.', '5/5.', '6/1.', '6/2.', '6/3.', '6/7.', '6/8.', '7/1.']
然后我的脚本的其余部分有:
outputsum = ""
pri_list = []
sec_list = []
stable_list = []
for intf in mylist:
for g60 in lc:
if g60 in intf:
if "ACTIVE" in intf:
pri_list.append(intf)
if "IDLE" in intf.text:
sec_list.append(intf)
for p in pri_list:
t1 = p[p.find("ACTIVE")+11:]
for s in sec_list:
t2 = s[s.find("IDLE")+11:]
if t1 == t2:
print "Found matching pair!"
if "ACTIVE" in p and "IDLE" in s:
print "Putting valid ACTIVE/IDLE pairs into stable_list."
stable_list.append(p)
stable_list.append(s)
for pair in stable_list:
for p1 in pri_list:
if p1 == pair:
pri_list.pop(pri_list.index(p1))
for s1 in sec_list:
if s1 == pair:
sec_list.pop(sec_list.index(s1))
for i in pri_list:
outputsum += i + "\n"
for i in sec_list:
outputsum += i + "\n"
print outputsum
ACTIVE 3/1.5
IDLE 3/1.2
IDLE 3/1.2
IDLE 3/1.10
“打印输出总和”的输出是我期望得到的,但执行上述所有操作似乎很长/很复杂。
有没有更简单/更好/更快的方法来做到这一点?
我检查了许多不同的线程和示例,尝试了集合、交集和差异,以及与其他循环的混合,但我无法得到我想要的结果。在玩了几天之后,我终于想出了上面的工作示例。但我确信有比我上面的方法更好的方法。
有什么想法吗?
【问题讨论】:
标签: python string list for-loop