在循环上将值插入列表(Python)

时间:2012-08-07 15:22:43

标签: python string list insert

我有以下列表清单:

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]]}

对此的任何帮助也非常感谢:)

6 个答案:

答案 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