紧凑的方式来编写列表列表

时间:2015-03-28 02:38:01

标签: list nested-lists

我正在编写一个程序,输出有序的数字列表列表。说输出如下:

[1,1,1]; [1,1,2]

我想通过眼睛看一下输出并对它有所了解,但我的输出是数百到数千行。我想用以下更紧凑的格式编写输出:[1,1,1/2],其中斜杠表示在第三个插槽中我可以有1或2.所以,对于更长的例子,[1/2, 1/3, 5, 8/9]将是[1,1,5,8];[1,1,5,9];[1,3,5,8];等的紧凑方式。任何人都可以建议使用伪代码算法来实现这个目标吗?

编辑:所有列表的长度相同。此外,我希望一般在最后有多个列表。例如{[1,1,2],[1,1,3],[1,2,4]}应该成为{[1,1,2 / 3],[1,2,4]}。

2 个答案:

答案 0 :(得分:0)

我做的是在第一个列表中的每个元素上使用哈希值。然后,您将遍历剩余的列表,并且对于其他列表中的每个位置,您都要检查该索引的第一个/原始列表中的哈希值,看看您之前是否看过它。所以你最终得到的结论是:

[1 : {1}, 1: {1, 3}, 5: {5}, 8: {8, 9}]

然后在打印/格式化列表时,您只需在哈希中打印每个键,除非您使用斜杠或其他任何键。

编辑:Bad Psuedocode(python)(未经测试):

def shorten_list(list_of_lists):
primary_list = list_of_lists[0]
hash_values = [{} * len(primary_list)]

for i in range(len(list_of_lists)):
    current_list = list_of_lists[i]
    for j in range(current_list):
        num = current_list[j]
        if num not in hash_values[j]:
            hash_values[j] = j

for i in range(len(hash_values)):
    current_dict = hash_values[i]
    print primary_list[i]
    for key in current_dict:
        if key != primary_list[i]:
            print '/', key

答案 1 :(得分:0)

以下是按您希望的方式对列表进行排序的实际代码。但也许最有用的可视化将是散点图。将数据导入您最喜欢的电子表格,并将其删除。

$(document).ready( function(){
  var numbers = [
    [1, 1, 5, 8],
    [1, 1, 5, 9],
    [1, 3, 5],
    [1, 1, 5, 10, 15]];

  $('#output').text(JSON.stringify(compactNumbers(numbers)));
});

function compactNumbers(numberlists){
  var output = [];

  for(var i = 0; i < numberlists.length; i++){
    for(var j = 0; j < numberlists[i].length; j++) {
      if(!output[j]) output[j] = [];
      if($.inArray(numberlists[i][j], output[j]) == -1){
        output[j].push(numberlists[i][j]);
      }
    }
  }

  return(output);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="output"></div>