web-dev-qa-db-ja.com

入力データから2Dリストを作成する方法は?

私はこれを試していました

n = int(input())
m = int(input())
print(n,m)
for i in range(0,n):
    for j in range(0,m):
        ar[i][j] = int(input())
for i in range(0,n):
    for j in range(0,m):
        print (ar[i][j])

しかし、それはエラーを示していました

Traceback (most recent call last):
  File "C:/Users/shivansh/Desktop/test.py", line 6, in <module>
    ar[i][j] = int(input())
NameError: name 'ar' is not defined

以前はC言語でも同じことをしていましたが、うまくいきました。では、Pythonでこれを行う方法は?

9
Shivansh Kumar

arをまだ宣言していません。 Pythonでは、個別の宣言と初期化を実行する必要はありません。それでも、名前に対してoperationsを実行することはできません。

次のようなものから始めます。

ar = [[0 for j in range(m)] for i in range(n)]
4
Arya McCarthy

ar[i][j] = int(input())のような割り当てを実行しようとする場合、arが定義されていないことを知っておく必要があります。これを修正する方法はたくさんあります。

C/C++の場合

C/C++では、次のような作業を行うと思います。

_#include <cstdio>

int main()
{
    int m, n;
    scanf("%d %d", &m, &n);
    int **ar = new int*[m];
    for(int i = 0; i < m; i++)
        ar[i] = new int[n];
    for(int i = 0; i < m; i++)
        for(int j = 0; j < n; j++)
            scanf("%d", &ar[i][j]);
    // Do what you want to do

    for(int i = 0; i < m; i++)
        delete ar[i];
    delete ar;

    return 0;
}
_

C/C++でscanfによる入力を取得する前に、newまたはmallocを呼び出してストレージを割り当てる必要があります。そうすると、scanfを実行できます。そうしないと、クラッシュします。

Pythonでそのようにする方法

コードによると、C/C++で行ったことと非常に似ています。_ar[i][j]_への代入を実行しようとすると、Pythonはarが何であるかを理解できません。だから最初にそれを知らせなければならない。

NOT-Pythonicの方法

NOT-Pythonicの方法は、C/C++で行ったようなものです。

_n = int(input())
m = int(input())

ar = []
for i in range(m):
    ar.append([])
    for j in range(n):
        k = int(input())
        ar[i].append(k)

for i in range(m):
    for j in range(n):
        print(ar[i][j])
_

C/C++で_ar = []_を実行した場合と同様に、リストを_int **ar = new int*[m];_で初期化します。 2次元リストの各行について、C/C++で_ar[i] = new int[n];_を実行したようにar.append([])を使用して行を初期化します。次に、inputを使用してデータを取得し、_ar[i]_に追加します。

Pythonicの方法

上記のようなジョブを実行する方法はそれほどPythonicではありませんが、代わりに List Comprehensions と呼ばれる機能を使用してそれを行うことができ、コードは次のように簡略化できます。

_n = int(input())
m = int(input())

ar = [[0 for j in range(n)] for i in range(m)]
for i in range(m):
    for j in range(n):
        k = int(input())
        ar[i][j] = k

for i in range(m):
    for j in range(n):
        print(ar[i][j])
_

コアar = [[0 for j in range(n)] for i in range(m)]は、mリストを含むリストを作成し、これらのmリストのリストごとにn 0を含むリスト内包であることに注意してください。

2
Time1ess

次のようにネストされたループで行列を初期化できます:

n = int(input()) # columns
m = int(input()) # rows
print(n,m)
matrix = []
for i in range(0,m):
    matrix.append([])
    for j in range(0,n):
        matrix[i].append(0)
        matrix[i][j] = int(input())
print matrix
1
manvi77

実際には、列数は必要ありません。行数を入力し、入力スペースを区切るだけです。

rows = int(input('Enter rows\n'))
my_list = []
for i in range(rows):
    my_list.append(list(map(int, input().split())))
0
Ankit Sharma

以前にarを宣言していないため、特定のインデックスに要素を割り当てることはできません。この方法で、特定のvalueに初期化された2次元リストをデカールできます。

arr = [[value]*c for _ in range(r)]

ここで、rおよびcは、それぞれ希望する行数および列数です。

0
virmis_007