Ma'lumotlarni uchta qatorda saqlang

Menda bu fayl bor:

1 2 3
2 1 3
7 8 9
4 5 3

va shunga o'xshash ma'lumotlarni saqlaydigan uchta massivni yaratmoqchi bo'lgan narsa:

Birinchi qatorda ma'lumotlar quyidagilar: 1, 2, 7, 4 Ikkinchi qatorda ma'lumotlar quyidagilar: 2, 1, 8, 5 uchinchi qatorda ma'lumotlar quyidagilar bo'ladi: 3, 3, 9, 3

Buni amalga oshirish uchun ustunlar sonini birinchi marta olishim kerak, deb o'ylayman, lekin buning imkoni yo'qligini bilmayman ...

O'ylaymanki, men barcha satrlarni o'qiy olaman va satrda ma'lumotlar qatorini saqlab, so'ngra istagan narsani o'z ichiga olgan uchta massivni yarataman, lekin bu yaxshi emas. Shunday qilib, sizdan buni so'rash yaxshiroqmi yoki yo'qmi, deb so'rayman.

Katta rahmat !

2
Uch qatorni yarating, satr bo'yicha fayllar qatorini o'qing. Har bir iteratsiya kosmosga bo'linadi va mos keladigan qatorlarga qo'shiladi.
qo'shib qo'ydi muallif Uladzimir Palekh, manba
docs.scipy.org/doc/numpy/ ga qarang. havola/yaratilgan// hellip; . a = numpy.genfromtxt (file, unpack = True) (hodisani bajarish kerak) ( a [i] ) ikki o'lchamli numpy qatorini qaytaradi, faylingizning ustuniga qarang).
qo'shib qo'ydi muallif Wisperwind, manba

6 javoblar

Splitdan keyin butun songa aylantirilishini, split va zip (ma'lumotlarni ko'chirib o'tkazish) ni o'qishingiz mumkin.

with open("file.txt") as f:
    s = list(zip(*([int(x) for x in l.split()] for l in txt)))

natija:

[(1, 2, 7, 4), (2, 1, 8, 5), (3, 3, 9, 3)]
2
qo'shib qo'ydi

Agar barcha satrlarda bir xil miqdordagi ustunlar bo'lsa, uni shunchaki ishlatishingiz mumkin:

with open(filename,'r') as file:
    data = zip(*[[int(x) for x in line.split()] for line in file])

Endi data </​​code> quyidagicha bo'ladi:

data == [(1, 2, 7, 4), (2, 1, 8, 5), (3, 3, 9, 3)]

Buning uchun map ro'yxatini map va sequence assignment dan foydalaning.

with open(filename,'r') as file:
    col1,col2,col3 = map(list,zip(*[[int(x) for x in line.split()] for line in file]))

Shunday bo'lgan taqdirda:

>>> col1
[1, 2, 7, 4]
>>> col2
[2, 1, 8, 5]
>>> col3
[3, 3, 9, 3]

Boshqa ustunlar mavjud bo'lsa va ularni qiziqtirmasangiz, boshqa ustunlarni qo'lga olish uchun (va ularni e'tiborsiz qoldirish uchun) * _ dan foydalanishingiz mumkin. Kabi:

with open(filename,'r') as file:
    col1,col2,col3,*_ = map(list,zip(*[[int(x) for x in line.split()] for line in file]))

Yoki islice yordamida hisoblash yukini kamaytirishingiz mumkin:

from itertools import islice

with open(filename,'r') as file:
    col1,col2,col3 = islice(map(list,zip(*[[int(x) for x in line.split()] for line in file])),3)
1
qo'shib qo'ydi

Agar siz keyinchalik qator asoslangan manipulyatsiya qilishni rejalashtirmoqchi bo'lsangiz, numpy dan foydalaning. Ko'pgina operatsiyalar uchun yuqori darajadagi interfeyslarga ega

import numpy as np
data = np.loadtxt(fname)
# either separate out copies of the arrays explicitly
col1 = data[:,0]
col2 = data[:,1]
col3 = data[:,2]
# or just operate directly on a column (or row), e.g.
print(data[:,1].max())
1
qo'shib qo'ydi

Fayl ob'ektini o'zingiz ochgan deb o'ylayapsizmi, bu qanday?

array = [line.split(" ") for line in file]
x, y, z = zip(*array)

x, y va z o'z navbatida birinchi, ikkinchi va uchinchi ustunlarni ushlab turadi.

0
qo'shib qo'ydi
x , y va z , eslatma ro'yxatida bo'ladi. Siz faqat zip ning chiqishi uchun ro'yxat yaratgansiz. Sizning vazifangizni bajarishingiz uchun bu juda foydasizdir.
qo'shib qo'ydi muallif Willem Van Onsem, manba
To'g'ri, siz to'g'ridan-to'g'ri iteratorga bir nechta vazifani bajarishingiz mumkin. Ro'yxat vazifasini tashqariga chiqaraman. Siz xuddi shunday javobni olasiz - x, y va z zig'ircha bo'ladi, men aytadigan darajada yaxshi, savol ro'yxatlarni so'ramadi.
qo'shib qo'ydi muallif Denziloe, manba

Avval faylingiz qatorini va yo'lini belgilang:

path = ...
arr = []

Keyin faylning har bir satrini yineleyin:

with open(path) as f:
    for line in f:
        arr.append(line.split(" "))

Bu o'lchamli mustaqil, ya'ni qator siz xohlaganingiz qadar uzun yoki keng bo'lishi mumkin.

Ammo, butun sonlarning o'lchamlari va uzunligi aniqlangan bo'lsa, siz quyidagilarni foydalanishingiz mumkin:

arr.append([line[0], line[2], line[4]]) # For one digit numbers, 3 columns
arr.append([line[0:1], line[3:4], line[5:6]]) # For 2 digit numbers, 3 columns

0, 2 va 4 - bu birinchi holatda raqamlaringizning pozitsiyasi, ikkinchisiga o'xshash narsa

Ustunlar sonini olish uchun arr [0] , arr [1] yoki arr [2] dan foydalaning. Yoki ma'lum bir raqam uchun arr [x] [y] .

0
qo'shib qo'ydi
Bu erda (a) barcha tamsayıların bir raqam uzunligi va (b) tekli bilan bitta ro'yxat tuzib, har bir satrda bir element bo'lishi kerak.
qo'shib qo'ydi muallif Willem Van Onsem, manba
OK, buni tuzataman
qo'shib qo'ydi muallif Juan T, manba

Balki Numpy'dan foydalanishga harakat qiling. Faylni matritsa sifatida o'qing, keyin uni ko'chiring.

from numpy import *
a = mat('1, 2, 3; 2, 1, 3; 7, 8, 9; 4, 5, 3')
b = transpose(a)
0
qo'shib qo'ydi
Python
Python
372 ishtirokchilar

Bu guruh python dasturlash tilini muhokama qilish uchun. Iltimos, o'zingizni hurmat qiling va faqat dasturlash bo'yicha yozing. Botlar mavzusini @botlarhaqida guruhida muhokama qling! FAQ: @PyFAQ Offtopic: @python_uz_offtopic

Python offtopic group !
Python offtopic group !
150 ishtirokchilar

@python_uz gruppasining offtop gruppasi. offtop bo'lsa ham reklama mumkin emas ) Boshqa dasturlash tiliga oid gruppalar @languages_programming