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',[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':[[3, 4, 7, 11, -2]] }

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

4

6 回答 6

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

但正如其他人所解释的那样,这种数据结构似乎很弱。

于 2012-08-07T15:58:01.800 回答
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
于 2012-08-07T15:50:30.013 回答
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)
于 2012-08-07T15:51:04.567 回答
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, '#')
于 2012-08-07T15:54:43.903 回答
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]]]
于 2012-08-08T04:16:00.430 回答
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
于 2012-11-06T19:20:25.080 回答