Ikkala ro'yxatning elementli ko'payishi

Men ikkita ro'yxatga kiradigan dasturni yozmoqchiman va ro'yxatlarning har biridagi ikkita argüman element-by-element ko'paytmasi bo'lgan bitta ro'yxatni qaytaradi. Agar ro'yxatlar turli uzunliklar bo'lsa, u ikkalasining qisqartirilgan ro'yxatini qaytarishi kerak. Mana yozdim:

s = raw_input("Enter the first list:")
c = list(s)
c = s.split()
c = map(int, c)

t = raw_input("Enter the second list:")
d = list(t)
d = s.split()
d = map(int, d)

def multiply(c, d):
    cd = [ ]
    for i in range(0, len(c)):
    cd.append(c[i]*d[i])

Umumiy fikr shundan iboratki, foydalanuvchi raqamlari to'liq raqamga aylanadi. Biroq, butun sonlar bilan bir nechta satrlarni yozib bo'lmaydigan xatoliklar va "10-sonli int() uchun yaroqsiz literal". Men 2 soatdan buyon bu ish ustida ishlayapman va nima qilishimni tushunolmayman !!! Iltimos yordam bering!

0
Yaxshi, @Jane. Bir oz javob berdim. Uning foydali yoki yo'qligini bilib olishingiz mumkin.
qo'shib qo'ydi muallif Christian Dean, manba
raw_input dan foydalanayotgan bo'lsangiz, sizning asosiy sababingizni ta'minlashingiz mumkin. Bu foydali bo'ladi
qo'shib qo'ydi muallif anand tripathi, manba
Kechirasiz, men kodni noto'g'ri kiritdim - endi tahrir qildim!
qo'shib qo'ydi muallif Jane, manba
Agar sizda biron bir taklif bo'lsa, men buni juda qadrlayman! Bu soat bo'ldi va men hali buni tushunolmayapman :(
qo'shib qo'ydi muallif Jane, manba

6 javoblar

Ko'paytirish operatori bilan xaritalashni sinashingiz mumkin!

>>> from operator import mul
>>> map(mul,c,d)

Misol!

>>> from operator import mul
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]
>>> map(mul,c,d)
[1, 4, 9]

Umid qilamanki bu yordam!

2
qo'shib qo'ydi

O'z kodingizni biroz ishlashga imkon beradi, shuning uchun uni tushunish osonroq. Siz tasodifan noto'g'ri kirishlar va boshqalar berdingiz.

s = raw_input("Enter the first list:")
c = s.split()
c = list(map(int, c))

t = raw_input("Enter the second list:")
d = t.split()
d = list(map(int, d))

def multiply(c, d):
    cd = [ ]
    for i in range(0, len(c)):
        cd.append(c[i]*d[i])
    return cd

print multiply(c, d)

Lekin, albatta, siz buni bir qatorda yoki boshqa javoblarga o'xshagan ro'yxatni tushunish orqali yanada pitonik tarzda qilishingiz mumkin.

0
qo'shib qo'ydi
@KeytanaPrabakaron yo'q, men uni bir satrda qila olaman deb aytdim, lekin mening javobim faqat OP-ning xatolarini tuzatishga qaratilgan edi, men yangi bir layn echimini amalga oshirish uchun emas. @ Siz o'zingizning parametrlarga mos kelishingiz kerak bo'lsa, funksiya multiplika (list1, list2) 2 ta ro'yxatni oladi, siz uni ko'paytirishni istagan ikkita ro'yxat bilan chaqirishingiz kerak.
qo'shib qo'ydi muallif umutto, manba
nima uchun biz uni bitta lineyada qilolmaymiz, deyapsizmi?
qo'shib qo'ydi muallif Keerthana Prabhakaran, manba
Rahmat! Ba'zi sabablarga ko'ra, o'zgaruvchilarni o'zgartirganimda, u ishlamay qoladi. Buning nima bo'lishi mumkinligi haqida biron bir fikr bormi?
qo'shib qo'ydi muallif Jane, manba

Keling, bunga bir qadam qo'yaylik.

Birinchidan, biz foydalanuvchidan raqamlarning two ro'yxatida o'qishimiz kerakligini bilamiz. Oddiylik uchun, foydalanuvchi bir yoki bir necha bo'shliqqa qiymatlarini kiritish orqali raqamlar ro'yxatini to'ldirishi mumkinligini taxmin qilaylik. Misol uchun.

1 2 3 4 5

Keling, biz kiritishni qanday kiritishimiz kerakligini aniqladik, uni to'g'ri ajratishimiz mumkin. Buni amalga oshirish uchun dastlabki uskuna .split() dan foydalanib satrlari ro'yxatiga bo'linib, keyin har bir qatorni haqiqiy raqamga aylantiramiz. Ammo bu mantiqni ikki marta ishlatishimiz kerak, uni kodlash get_numbers() funksiyasida ixchamlash imkonini beradi:

def get_numbers():
    numbers = input("Enter some numbers: ").split()
    return [int(n) for n in numbers]

Endi biz yangi funktsiyadan foydalanuvchidan raqamlarning ikkita ro'yxatini to'plashimiz mumkin. Birinchi ro'yxat list1 va ikkinchi list2 deb nom beraman:

list1 = get_numbers()
list2 = get_numbers()

Endi biz foydalanuvchi ro'yxatini ro'yxatga olish muammosini hal qildik, biz diqqatimizni muammoning ikkinchi qismiga aylantiramiz:

Ro'yxatlarning har biridagi ikkita argüman element-by-element ko'paytmasi bo'lgan yagona ro'yxatni qaytaradi. Agar ro'yxatlar turli uzunliklar bo'lsa, u ikkalasining qisqartirilgan ro'yxatini qaytarishi kerak.

Keling, birinchi talabini bajarish bilan boshlaylik, keyin biz ikkinchi ishni bajaramiz.

Bilamizki, biz har bir elementni n-elementni ikki ro'yxatdan juft-juft qilib olishimiz kerak, ularni bir nechta qilib yig'amiz va natijani yangi ro'yxatga kiritamiz. Ro'yxatni ikki tomonlama takrorlash vazifasini bajarish uchun zip() dan foydalanishimiz mumkin. Shunga qaramay, biz oddiy for loop o'rniga ro'yxat ta'rifini foydalanamiz:

[a * b uchun a, b zip (list1, list2)]

Keling, yana bir funksiyani shchavbat uchun saralaymiz va uni zip_and_multiply() deb ataymiz:

def zip_and_multiply(list1, list2):
    return [a * b uchun a, b zip (list1, list2)]

Biroq, buni tushunmasdan, biz ikkinchi talabni bajardik ( "Agar ro'yxatlar turli uzunliklar bo'lsa, u ikkalasining qisqartirilgan ro'yxatini qaytarib berishi kerak." ).

Ko'rib turganingizdek, zip() turli uzunlikdagi ikkita ro'yxat berilsa, bu ikki ro'yxatning eng qisqa vaqtida zippingizni to'xtatadi, shuning uchun ikkinchi talabni mukammal bajaradi.

Qolgan barcha narsa - list1 va list2 (o'zgaruvchilar) da ishlatiladigan zip_and_multiply() natijasini chop etish:

print zip_and_multiply(list1, list2)

Yuqoridagi kodni (phew!) Yozganimizdan so'ng, yakuniy dasturimiz butunligicha bo'ladi (bu kod yuqorida qanday paydo bo'lganidan qat'iy nazar).

def get_numbers():
    numbers = input("Enter some numbers: ").split()
    return [int(n) for n in numbers]

def zip_and_multiply(list1, list2):
        return [a * b uchun a, b zip (list1, list2)]

list1 = get_numbers()
list2 = get_numbers()

print zip_and_multiply(list1, list2)

Shuni ta'kidlash kerakki, yuqorida ko'rsatilgan kodda odatdagi dasturlarda, masalan, xatolarni boshqarish bilan bog'liq ko'plab kodlar yo'q.

0
qo'shib qo'ydi

Sizning kodingiz bilan matn terish xatolari mavjud deb o'ylayman. Bu shunday bo'lishi kerak:

s = raw_input("Enter the first list:")
c = s.split()
c = map(int, c)

t = raw_input("Enter the second list:")
d = t.split()
d = map(int, d)

#if you want align two lists,try this:
if len(d)len(c):
    c.extend([1] * (len(d) - len(c)))
else:
    pass
#you will get c [2,3,1,1,1]  d[4,5,2,6,7]

cd = []
def multiply(c, d):
    for i in range(0, len(c)):
        cd.append(c[i]*d[i])

multiply(c, d)

print cd

Yoki buni sinashingiz mumkin:

lista=raw_input("list a")

listb=raw_input("list b")


print [a*b for a,b in zip(map(int,lista.split()),map(int,listb.split()))]
0
qo'shib qo'ydi
Funktsiyangizni chaqirganda siz funktsiya parametrlariga mos kelishi kerak. Uni chaqiring; ko'paytirish (a, b) . Va bu o'zgaruvchilar funktsiyalar doirasiga yuboriladi.
qo'shib qo'ydi muallif umutto, manba
@Jane Iltimos, kodingizni va funktsiya parametrlarini tekshiring, siz kodni disk raskadrovka qilishga yordam beradigan IDE (Pycharm kabi) dan foydalanishga urinib ko'rishingiz mumkin. Agar bu muammo aniqlansa, javobni qabul qiling.
qo'shib qo'ydi muallif McGrady, manba
@Jane Mening kodim yaxshi ishlaydi. Menimcha, siz boshqa savol so'rashingiz kerak.
qo'shib qo'ydi muallif McGrady, manba
@Jane. Javobimni tahrir qildim, sinab ko'ring.
qo'shib qo'ydi muallif McGrady, manba
@Jane Kodingizni diqqat bilan tekshiring, shuning uchun siz o'zgaruvchilardan foydalanishning yaxshi odatlarini rivojlantirishingiz kerak, batafsil ma'lumotni Python kodi uchun uslublar qo'llanmasi .
qo'shib qo'ydi muallif McGrady, manba
Yana bir bor rahmat. Birinchisingizni o'rganib chiqdim, chunki bu men uchun mantiqan. Men ham uni tekshirib chiqdim - faqat shu uzunlikdagi ro'yxatlar bilan ishlash kabi ko'rinadi. Buni qanday o'zgartirish kerakligi haqidagi har qanday fikr?
qo'shib qo'ydi muallif Jane, manba
Men buni yana bir bor tekshirib chiqdim va muayyan raqamlar faqat ishlamayapti. Nima uchun tushunmayapman; Masalan, agar men birinchi qatorda 1 4 3 1 ni yozsam va ikkinchi uchun 3 2 3 ishlayotgan bo'lsa, lekin 1 2 3 4 ni yozsam va 1 2 3 bo'lsa, u "tashqaridan". Nima uchun ...
qo'shib qo'ydi muallif Jane, manba
Xo'sh, sizning eski ishingiz tugadi, ammo muammolarim ayrim o'zgaruvchilarni o'zgartirdi (men turli harflardan foydalanishim kerak edi) va nima uchun buni amalga oshirganimdan keyin kod ishlashni to'xtatdi. Men bunga bir necha marotaba keldim va har biri o'z navbatida juda o'zgarib ketdi. Ushbu xato nima uchun ro'y berishi mumkinligi haqidagi har qanday fikr?
qo'shib qo'ydi muallif Jane, manba
Ko'p rahmat, u ishladi! Biroq, kodda aniqlik bayonotidan foydalanishim kerak. Men bir nechta ifodani (defMultiple (a, b) :) oldin qo'shib qo'ydim, lekin a va b belgilanmaganligini bildiradi. Ularni = ro'yxatga olish va ro'yxatlash uchun belgilab qo'ydim, ammo bu ishlamadi. Buni tuzatish bo'yicha har qanday fikr bormi? Yana bir bor rahmat!
qo'shib qo'ydi muallif Jane, manba

Siz ushbu xabarda aytib o'tilgan zip bilan aralashgan ro'yxatni tushunishingiz mumkin. Ushbu havolani ulash bo'limiga qarang.

0
qo'shib qo'ydi
Men bunga qaragandim, raw_input bilan ishlay olmayman.
qo'shib qo'ydi muallif Jane, manba

Birinchidan, muammoingizni hal qilish uchun Ro'yhatni tushunish . Endi muammoingizni hal qilish imkonini beradi -

Get input from user - for the

"errors with not being able to multiple strings with integers"

muammo bo'lib, siz tamsayı qiymatlari ustida ishlayotgan bo'lsangiz, ro'yxatdagi barcha qiymatlar int turiga ega bo'lishiga ishonch hosil qilishingiz kerak. Siz foydalanuvchini qadriyatlarni kiritishingiz va uni int formatida ishlatishingiz mumkin -

user_input = xarita (int, raw_input ("Birinchi ro'yxatni kiriting:"). strip() split (''))

Bu foydalanuvchilardan ajratilgan tamsayılarni oladi va ularni ro'yxatga o'tkazadi.

Hozir uchun

"invalid literal for int() with base 10."

foydalanuvchidan kirishni amalga oshirayotganda faqat tamsayılar kiritilishiga ishonch hosil qilishingiz kerak. Agar foydalanuvchi biror mag'lubiyat yoki bo'sh javobni taqdim qilsa, bu xatoni tashlaydi.

Multiply two Lists - While multiplying yours list following scenarios can arise :

1. Bu ro'yxat bir xil uzunlikda.

2.Quyidagi ro'yxatlar teng bo'lmagan.

Ro'yxatning uzunligini tekshirishingiz kerak, agar uzunlik farqli bo'lsa, elementlar kichik ro'yxatdagi elementlar tugamaguncha va ikkala ro'yxatni tashkil etadigan kattaliklarni kattaroq ro'yxatga qo'shmaguncha tashkil qiladi. Quyida sizning savolingiz uchun kod snippet -

c = map(int, raw_input('Enter First List').strip().split(' '))
d = map(int, raw_input('Enter Second List').strip().split(' '))

answer = [c[i]*d[i] if ilen(d) else d[i]) for i in xrange(max(len(c), len(d)))]

answer will contain the desired result set.

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