我如何输入逗号分隔的正整数对,每对在python中用分号(;)分隔

时间:2018-07-25 13:28:50

标签: python python-3.x

我尝试了很多方法,但是如何输入类似这样的矩阵

var str = "12312512341231";
var sum = str.Sum(x => x - '0');

我的方法如下所示:

2,3;2,4;2,1;3,5;3,4;4,2
4,2;4,1;3,1;3,6;4,4;1,4
1,2;1,3;4,5;5,5;2,1;1,5
6,2;6,1;2,2;5,6;2,6;2,5
3,2;3,3;6,5;6,6;6,3;6,4
5,3;5,4;5,1;5,2;4,6;1,6

其中n是n乘n的矩阵的阶数。我需要在每个像元中输入另一个像元的坐标。例如:在(1,1)我们有(2,3),那么它应该将我重定向到单元格row = 2和column = 3的坐标是(3,1)等等,直到满足结束条件。我在这里使用基于1的索引。当我像上面那样做时,它以'2,3'作为字符串,而当我使用matrix=[[j for j in input().split(';')]for i in range(n)] 时,会出现错误,表明2,3不能是整数。任何人都可以想出办法吗?

4 个答案:

答案 0 :(得分:0)

我的示例将根据数据制作一个6x6的矩阵。每个单元格包含一对数字:

data = """
2,3;2,4;2,1;3,5;3,4;4,2
4,2;4,1;3,1;3,6;4,4;1,4
1,2;1,3;4,5;5,5;2,1;1,5
6,2;6,1;2,2;5,6;2,6;2,5
3,2;3,3;6,5;6,6;6,3;6,4
5,3;5,4;5,1;5,2;4,6;1,6"""

import re
from pprint import pprint
groups = re.findall(r'(\d+),(\d+)', data)
pprint([[tuple(map(int, groups[j*6 + i])) for i in range(6)] for j in range(6)])

打印:

[[(2, 3), (2, 4), (2, 1), (3, 5), (3, 4), (4, 2)],
 [(4, 2), (4, 1), (3, 1), (3, 6), (4, 4), (1, 4)],
 [(1, 2), (1, 3), (4, 5), (5, 5), (2, 1), (1, 5)],
 [(6, 2), (6, 1), (2, 2), (5, 6), (2, 6), (2, 5)],
 [(3, 2), (3, 3), (6, 5), (6, 6), (6, 3), (6, 4)],
 [(5, 3), (5, 4), (5, 1), (5, 2), (4, 6), (1, 6)]]

答案 1 :(得分:0)

正如@RafaelC所提到的,不清楚您想要int(“ 2,3”)返回什么。我认为,尽管您想要执行以下操作:

matrix=[[j.split(',') for j in input().split(';')]for i in range(2)]

如果您确实希望每个对都是一个元组,则可以将j.split(',')包裹在tuple中。

答案 2 :(得分:0)

据我了解,您想填充从(1,1)开始的矩阵,并跳转到此位置上写的下一个位置。应该这样做:

import re
from pprint import pprint

data = """
        2,3;2,4;2,1;3,5;3,4;4,2
        4,2;4,1;3,1;3,6;4,4;1,4
        1,2;1,3;4,5;5,5;2,1;1,5
        6,2;6,1;2,2;5,6;2,6;2,5
        3,2;3,3;6,5;6,6;6,3;6,4
        5,3;5,4;5,1;5,2;4,6;1,6
       """

jumps = [(int(i)-1, int(j)-1) for i, j in re.findall(r'(\d+),(\d+)', data)]
array = [ [0]*6 for _ in range(6)]

i = j = 0
for _ in range(100):  # There is no end condition define, will do 100 iterations.
    array[j][i] = input()
    i, j = jumps[j*6+i]

如果仅输入索引进行36次迭代,您将得到如下所示:

[[ 1, 20,  0, 28, 25, 22],
 [ 4, 27,  0, 23,  0,  0],
 [ 3,  2, 33,  0, 19,  0],
 [ 0, 21, 26,  0,  0, 31],
 [ 0, 32, 29, 34,  0, 30],
 [36,  0, 24,  0,  0, 35]]

您可以看到以下循环:

(3, 5) -> (6, 5) -> (6, 4) -> (2, 5) -> 
(3, 3) -> (4, 5) -> (6, 6) -> (1, 6) -> 
(5, 3) -> (2, 1) -> (2, 4) -> (6, 1) -> 
(4, 2) -> (3, 6) -> (5, 1) -> (3, 4) -> 
(2, 2) -> (4, 1) -> (3, 5)

答案 3 :(得分:0)

ast模块似乎相对未知,但是可能会为您提供所需的内容。诚然,我不是100%地确定我了解您想要什么,但是以下代码可能会提供解决方案,或者至少会有所帮助。

import ast
def main():
    inp_matrix = \
"""2,3;2,4;2,1;3,5;3,4;4,2
4,2;4,1;3,1;3,6;4,4;1,4
1,2;1,3;4,5;5,5;2,1;1,5
6,2;6,1;2,2;5,6;2,6;2,5
3,2;3,3;6,5;6,6;6,3;6,4
5,3;5,4;5,1;5,2;4,6;1,6"""    
    lines = inp_matrix.split('\n')
    out_matrix = []
    for ln in lines:
        matrix_line = [ast.literal_eval(e) for e in ln.split(';')]
        out_matrix.append(matrix_line)
    for el in out_matrix:
        print el
    return 0

if __name__ == "__main__":
    exit(main())

输出为:

  

[(2,3),(2,4),(2,1),(3,5),(3,4),(4,2)]
  [(4,2),(4,1),(3,1),(3,6),(4,4),(1,4)]
  [(1,2),(1,3),(4,5),(5,5),(2,1),(1,5)]
  [(6,2),(6,1),(2,2),(5,6),(2,6),(2,5)]
  [(3,2),(3,3),(6,5),(6,6),(6,3),(6,4)]
  [(5,3),(5,4),(5,1),(5,2),(4,6),(1,6)]