python嵌套列表:替换嵌套列表中的重复项,同时保留第一次出现

时间:2012-06-14 16:51:43

标签: python nested-lists

我有一个列表列表,并且希望用除了第一次出现之外的短划线替换整个列表/矩阵中同一个单词的所有出现。我创建了一个单独的列表,其中包含原始列表列表中每个元素的数量。我希望第一次出现的单词被计数列表中的项目替换,因此数字就在那里。

table = [['Bacteria', 'Aquificae', 'Persephonella'],
        ['Bacteria', 'Aquificae', 'Thermovibrio'],
        ['Bateria', 'Firmicutes', 'Bacillus']]
countlist = ['Bacteria3', 'Aquificae2', 'Persephonella1', 'Thermovibrio1', 'Firmicutes1', 'Bacillus1']

所以当我完成时,我希望列表是这样的:

table = [['Bacteria3', 'Aquificae2', 'Persephonella1'],
        ['-', '-', 'Thermovibrio1'],
        ['-', 'Firmicutes1', 'Bacillus1']]

我想把它放到一个制表符分隔的表中,所以它最终看起来不会那么混乱。

这是我目前用计数列表版本替换单词但不起作用的内容:

for num in range(1525):
    for n in table[num]:
            for s in count:
                    if n in s:
                            n = s

修改 使用Python 2.6.1

2 个答案:

答案 0 :(得分:1)

我无法判断你的表是否需要破折号,或者只是你认为需要进入制表符分隔表的步骤,这段代码将获得一个名称附加了可用于制作的总数的列表制表符分隔表

from collections import Counter
count= Counter([item for sublist in table for item in sublist])
totals= ["%s%i"%(e,c) for e,c in count.most_common()]

#can then be tab deliminated
"\t".join(totals)

答案 1 :(得分:1)

我同意评论和数据结构的其他答案中所说的一切。我只添加了这个答案,因为它提供了一种以OP请求的格式获取表格的方法。

EDIT注释掉Counter的使用,以便在Python 2.6上使用

# from collections import Counter
from pprint import pprint

table = [['Bacteria', 'Aquificae', 'Persephonella'],
        ['Bacteria', 'Aquificae', 'Thermovibrio'],
        ['Bacteria', 'Firmicutes', 'Bacillus']]

# count_dict = Counter( [ item for row in table for item in row   ] )

count_dict = {}
for row in table:
    for item in row:
        count_dict[item] = count_dict.get(item, 0) + 1

for index_row, row in enumerate(table):
    for index_col, element in enumerate(row):
        if element in count_dict:
            table[index_row][index_col] = '%s %s' % (element, count_dict[element])
            del count_dict[element]
        else:
            table[index_row][index_col] = '-'

pprint(table)

产生:

[['Bacteria 3', 'Aquificae 2', 'Persephonella 1'],
 ['-', '-', 'Thermovibrio 1'],
 ['-', 'Firmicutes 1', 'Bacillus 1']]