如何从列表创建网络数据

时间:2015-11-09 04:24:26

标签: python list

我的数据如下:

data = [['A', 'B', 'C', 'D'],
        ['E', 'F', 'G'],
        ['I', 'J']]

我想将数据转换为以下内容:

data = [['A', 'B'],
        ['A', 'C'],
        ['A', 'D'],
        ['B', 'C'],
        ['B', 'D'],
        ['C', 'D'],
        ['E', 'F'],
        ['E', 'G'],
        ['F', 'G'], 
        ['I', 'J']]

我的代码无效:

for item in data:
    count = len(item)    
    for i in range (0, count):
        print item[i], item[i+1]

这些代码需要改进。有什么建议吗?

5 个答案:

答案 0 :(得分:4)

这里最重要的是对列表中的每个项目使用itertools.combinations()。请参阅下面的示例

>>> from itertools import combinations
>>> list(combinations(['A', 'B', 'C', 'D'] , 2))
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D')]

然后使用列表推导或chain.from_iterable()

将结果合并到单个列表中相当容易
>>> data = [['A', 'B', 'C', 'D'],
...         ['E', 'F', 'G'],
...         ['I', 'J']]
>>> list(chain.from_iterable(combinations(x, 2) for x in data))
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), ('C', 'D'), ('E', 'F'), ('E', 'G'), ('F', 'G'), ('I', 'J')]

答案 1 :(得分:3)

您可以使用itertools.combinations

from itertools import combinations

data = [['A', 'B', 'C', 'D'],
        ['E', 'F', 'G'],
        ['I', 'J']]

result = []
for sublist in data:
    result.extend(map(list, combinations(sublist, 2)))

print result

输出

[['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'C'], ['B', 'D'], ['C', 'D'], ['E', 'F'], ['E', 'G'], ['F', 'G'], ['I', 'J']]

答案 2 :(得分:3)

正如所指出的,您可以将itertool.combinations与列表理解结合使用来展平列表:

>>> from itertools import combinations
>>> [x for d in data for x in combinations(d, 2)]
[('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'), ('B', 'D'), 
 ('C', 'D'), ('E', 'F'), ('E', 'G'), ('F', 'G'), ('I', 'J')]

答案 3 :(得分:2)

  

你只需要3个嵌套for循环

data2 = []
for item in data:
    for i in range(0, len(item)-1):
        for j in range(i+1, len(item)):
            data2.append([item[i],item[j]])

print data2  

输出:

[['A', 'B'], ['A', 'C'], ['A', 'D'], ['B', 'C'], ['B', 'D'], ['C', 'D'], 
 ['E', 'F'], ['E', 'G'], ['F', 'G'], ['I', 'J']]

答案 4 :(得分:0)

这是一个python one liner

pairs = [ [item[i], item[j]] for item in data for i in range(len(item)) for j in range(i + 1, len(item))]