2

所以我有一个 biiiig 列表,看起来像:

big_list = [[17465, [22, 33, 1, 7, 83, 54, 84, -5], '123-432-3'], [13254, [42, 64, 4, -5, 75, -2, 1, 6], '1423-1762-4'], [...........................................................................................................], [17264, [22, 75, 54, 2, 87, 12, 23, 86], '14234-453-1']]

我需要遍历整个列表列表,当它检测到两个或多个相同的字符串(每个内部列表的元素 [2],例如'123-423-3')时,它将合并整数列表(元素 [ 1]) 与该字符串相关,其中包含与检测到的最后一个相同值字符串相关的整数列表。

4

3 回答 3

1

我认为这可以解决您的问题。

big_list = [[17465, [22, 33, 1, 7, 83, 54, 84, -5], '123-432-3'], \
            [13254, [42, 64, 4, -5, 75, -2, 1, 6], '1423-1762-4'], \
            [17264, [22, 75, 54, 2, 87, 12, 23, 86], '14234-453-1']]


# adding same string element to big_list
big_list.append([22222, [10, 12, 13], '14234-453-1'])
#now should itterate big_list, and when '14234-453-1' is found in 2 inner lists.
#it will put the values [10, 12, 13] into the first instance and remove the second.

print "Before:"
for l in big_list:
      print l

seen_list = {}
del_list = []
for inner in xrange(len(big_list)):
      if big_list[inner][2] in seen_list:
            for item in big_list[inner][1]:
                  big_list[seen_list[big_list[inner][2]]][1].append(item)
            del_list.append(inner)
      else:
            seen_list[big_list[inner][2]] = inner

for i in reversed(del_list):
      del big_list[i]

print "after:"

for l in big_list:
      print l

结果:

>>> 
Before:
[17465, [22, 33, 1, 7, 83, 54, 84, -5], '123-432-3']
[13254, [42, 64, 4, -5, 75, -2, 1, 6], '1423-1762-4']
[17264, [22, 75, 54, 2, 87, 12, 23, 86], '14234-453-1']
[22222, [10, 12, 13], '14234-453-1']
after:
[17465, [22, 33, 1, 7, 83, 54, 84, -5], '123-432-3']
[13254, [42, 64, 4, -5, 75, -2, 1, 6], '1423-1762-4']
[17264, [22, 75, 54, 2, 87, 12, 23, 86, 10, 12, 13], '14234-453-1']
于 2012-07-31T10:53:56.140 回答
1

如果您在以下任何地方寻找字符串匹配项,这就是我的解决方案big_list

>>> from collections import OrderedDict
>>> big_list = [[17465, [1, 2, 3], '123-432-3'], [13254, [4, 5, 6], '1423-1762-4'], [17264, [7, 8, 9], '14234-453-1'], [12354, [10, 11, 12], '14234-453-1'], [12358, [13, 14], '14234-453-1'], [99213, [15], '123-999-3'], [27461, [16, 17, 18], '123-432-3']]
>>> def amalgamate(seq):
        d = OrderedDict()
        for num, ints, text in big_list:
            d.setdefault(text, [num, [], text])[1].extend(ints)
        return d.values()

>>> amalgamate(big_list)
[[17465, [1, 2, 3, 16, 17, 18], '123-432-3'], [13254, [4, 5, 6], '1423-1762-4'], [17264, [7, 8, 9, 10, 11, 12, 13, 14], '14234-453-1'], [99213, [15], '123-999-3']]
于 2012-07-31T11:12:01.920 回答
0

以目前的形式,问题尚不清楚,但这可能是您正在寻找的(这适用于连续匹配):

>>> from itertools import groupby
>>> from operator import itemgetter
>>> big_list = [[17465, [1, 2, 3], '123-432-3'], [13254, [4, 5, 6], '1423-1762-4'], [17264, [7, 8, 9], '14234-453-1'], [12354, [10, 11, 12], '14234-453-1'], [12358, [13, 14], '14234-453-1'], [99213, [1], '123-999-3']]
>>> def amalgamate(seq):
        for k, g in groupby(seq, itemgetter(2)):
            num, ints, text = next(g)
            for sublist in g:
                ints.extend(sublist[1])
            yield [num, ints, text]


>>> list(amalgamate(big_list))
[[17465, [1, 2, 3], '123-432-3'], [13254, [4, 5, 6], '1423-1762-4'], [17264, [7, 8, 9, 10, 11, 12, 13, 14], '14234-453-1'], [99213, [1], '123-999-3']]
于 2012-07-31T10:51:12.117 回答