我是python的新手,我需要帮助从这个数据类型创建/表示一个数组。
link1|2-3,6-9,12-13|4-5,10-11,14-16格式是link_name|boundary1|boundary2,我需要将值A放到boundary1,把B放到boundary2
这将导致以下结果:
position : 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
value : A A B B A A A A B B A A B B B发布于 2014-02-19 11:41:37
这就是我想出来的:
data = data.split('|')[1]
data = data.split(',')
data = [d.split('-') for d in data]
data = [(int(d[0]), int(d[1])) for d in data]
positions = range(2, 17)
values = ['A' if any(data[j][1] >= i >= data[j][0] for j in range(len(data))) else 'B' for i in positions]基本上,除了第一个范围列表之外,不需要任何信息,因为默认情况下,任何不是'A‘的信息都是'B’。我使用代码的前四行将您的范围数据放入这种格式:
[(2,3), (6,9), (12,13)]然后进行列表理解来对数据进行分类。
发布于 2014-02-19 12:03:09
虽然可能不像基于字典的方法那样高效,但这也完成了以下工作:
data = "link1|2-3,6-9,12-13|4-5,10-11,14-16"
link_name, boundary_1, boundary_2 = data.split("|")
boundary_1 = [(b, "A") for b in boundary_1.split(",")]
boundary_2 = [(b, "B") for b in boundary_2.split(",")]
temp = boundary_1 + boundary_2
# We sort the temp list based on the starting point
temp = sorted(temp, key=lambda x: int(x[0].split("-")[0]))
position = []
value = []
for pair, letter in temp:
start, stop = pair.split("-")
# We loop through all the intermittent values that are not in the input
for val in range(int(start), int(stop)+1):
position.append(val)
value.append(letter)
print "position:\t{}".format("\t".join([str(x) for x in position]))
print "value: \t{}".format("\t".join([x for x in value]))这将生成所请求的输出(与制表符分离):
position: 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
value: A A B B A A A A B B A A B B B发布于 2014-02-19 11:44:15
你可能想要一本字典之类的东西。
line = "link1|2-3,6-9,12-13|4-5,10-11,14-16"
a, b = line.split("|")[1:]
a = [item for i in a.split("-") for item in i.split(",")]
b = [item for i in b.split("-") for item in i.split(",")]
data = {k:"A" for k in a}
data.update({k:"B" for k in b})
print datahttps://stackoverflow.com/questions/21879228
复制相似问题