我有以下列表清单:
sweet = [['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
我希望迭代列表列表并用#字符分隔不同的子列表组,即我希望在子列表字符串的第一个元素发生变化时插入#。
期望的结果
>>sweet
>>[['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], '#', ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
也许是琐碎的任务,但我对Python很陌生,非常感谢。
修改
我知道也许字典现在可能是一个更好的数据结构,因此'#'可能不需要密钥,我的目的是将它用作工作站的一部分(字符串中的第一个数字),这样我就可以在列表中迭代时对这些工作站进行计算。
我看到的目标是迭代列表(应该使其成为字典)并计算每个重要的第一个数字中的整数列表对之间的差异。期望的最终结果如下:{' 1234':[[-38,11,-4,11,23],[40,-5,5,6,-1]]' 1567& #39;:[[3,4,7,11,-2]]}
对此的任何帮助也非常感谢:)
答案 0 :(得分:2)
您的数据似乎可以更好地组织为字典。像这样:
sweet = {'1234-4321-1': [5, 6, -4, 11, 22],
'1234-7834-1': [43, -5, 0, 0, -1],
'1234-5376-1': [3, 0, -5, -6, 0],
'1567-3454-1': [4, 6, 8, 3, 3],
'1567-9987-1': [1, 2, 1, -4, 5] }
然后您可以通过键访问元素,就像在sweet['1234-4321-1']
中一样,这将返回您的第一个列表。
或者,因为第一个数字似乎是分裂的关键因素,更复杂一些:
sweet = {'1234': [['4321-1', [5, 6, -4, 11, 22]],
['7834-1', [43, -5, 0, 0, -1]],
['5376-1', [3, 0, -5, -6, 0]]],
'1567': [['3454-1', [4, 6, 8, 3, 3]],
['9987-1', [1, 2, 1, -4, 5]]]
}
然后说sweet['1234']
会给你一个你可以通过索引解决的对的列表。 sweet['1234'][0]
给出了列表中的第一个条目。
话虽如此,您可以通过执行以下操作来插入“#”:
sweet = [['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
skip = False
for i in range(len(sweet)-1):
if skip: #skip over the '#' that was just inserted
skip = False
continue
front_num_1 = sweet[i][0].split('-')[0]
front_num_2 = sweet[i+1][0].split('-')[0]
if front_num_1 != front_num_2:
sweet.insert(i+1, '#')
skip = True
print sweet
但正如其他人所解释的那样,这种数据结构似乎很弱。
答案 1 :(得分:1)
这可以做你想要的,但不是优雅的方式(我自己是python的新手)。
sweet = [['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
ans=[]
j=sweet[0][0].split('-')[0]
for i in sweet:
print i
if i[0].split('-')[0]!=j:
ans.append("#")
ans.append(i)
j=i[0].split('-')[0]
sweet=ans
答案 2 :(得分:1)
这可以完成任务,但我认为您的数据结构选择不当。
new_sweet = sweet[0]
for s in sweet[1:]:
if s[0].split('-')[0] != new_sweet[-1][0].split('-')[0]:
new_sweet.append('#')
new_sweet.append(s)
答案 3 :(得分:1)
f = lambda l: l[0].split('-')[0]
indexes = (i for i in range(1, len(sweet)) if f(sweet[i]) != f(sweet[i-1]))
for i, j in enumerate(indexes):
sweet.insert(i+j, '#')
答案 4 :(得分:0)
>>> from itertools import groupby, chain
>>> def join(iterable, delimiter):
i = iter(iterable)
yield next(i)
for el in i:
yield delimiter
yield el
>>> sweet = [['1234-4321-1',[5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
>>> groups = (g for k, g in groupby(sweet, lambda x: x[0].partition('-')[0]))
>>> list(chain.from_iterable(join(groups, delimiter='#')))
[['1234-4321-1', [5, 6, -4, 11, 22]], ['1234-7834-1', [43, -5, 0, 0, -1]], ['1234-5376-1', [3, 0, -5, -6, 0]], '#', ['1567-3454-1', [4, 6, 8, 3, 3]], ['1567-9987-1-', [1, 2, 1, -4, 5]]]
答案 5 :(得分:0)
for i in range(len(s)-1):
a,b=s[i][0][:4], s[i+1][0][:4]
if a!=b:
s.insert(i+1,"#")
break