Python'dagi 2 satr orasida umumiy harflarni topish

Uy vazifasini bajarish uchun 2 ta foydalanuvchi kiritilgan satrlarni qabul qilishim kerak, va qancha harflar keng tarqalganligini aniqlayman (ikkala satrning bir xil pozitsiyasida), shuningdek umumiy harflarni toping .. Masalan, ikkala satr uchun 'mushuk' va ' "rat", 2 ta umumiy harf pozitsiyasi mavjud (bu holatda 2 va 3-chi pozitsiyalar mavjud) va umumiy harflar ikkitadir, chunki "a" topilgan va "t" bir marta ham topilgan.

Men dasturni ishlab chiqdim va u yaxshi ishladi, ammo keyinchalik o'qituvchim uy vazifasini yangi misollar bilan takrorladi, ayniqsa takroriy harflar bilan misollar va mening dasturim buning uchun ishlamaydi ... Masalan, "ahahaha" va "huhu" - bu holatda 0 ta harf mavjud bo'lsa-da, ular orasida 3 ta harf mavjud (chunki magistral 2da 'h' 1-satrda uch marta paydo bo'ladi).

Mening butun masala shundaki, men "h" ning birinchi satrda bir necha marta paydo bo'lishini hisoblashni bilmayman, shuningdek, huhu ichidagi SECOND "h" ni qanday tekshirishni bilmayman, chunki u faqat hisoblash kerak noyob harflar, shuning uchun jami umumiy harflarning soni 2 bo'lishi kerak.

Bu mening joriy kodim:

S1 = input("Enter a string: ")
S2 = input("Enter a string: ")
i = 0
big_string = 0
short_string = 0
same_letter = 0
common_letters = 0

if len(S1) > len(S2):
    big_string = len(S1)
    short_string = len(S2)
elif len(S1) < len(S2):
    big_string = len(S2)
    short_string = len(S1)
elif len(S1) == len(S2):
    big_string = short_string = len(S1)

while i < short_string:
    if (S1[i] == S2[i]) and (S1[i] in S2):
        same_letter += 1
        common_letters += 1
    elif (S1[i] == S2[i]):
        same_letter += 1
    elif (S1[i] in S2):
        common_letters += 1
    i += 1

print("Number of positions with the same letter: ", same_letter)
print("Number of letters from S1 that are also in S2: ", common_letters)

Shunday qilib, bu kod umumiy harflarsiz satrlar uchun ishladi, lekin men uni "ahahaha" va "huhu" bilan ishlatishga harakat qilsam, 0 ta umumiy pozitsiyani (mantiqiy) va 2 ta umumiy harfni (u 3 bo'lishi kerak) olaman. quyidagilarni qo'shishga harakat qilsam ishlashim mumkin:

while x < short_string:
    if S1[i] in S2[x]:
        common_letters += 1
    else:
        pass
    x += 1

Biroq, bu ishlamayapti ...

Buni amalga oshirish uchun to'g'ridan-to'g'ri javob yoki kodni so'ramayman, chunki men uni o'zim qilishni xohlayman, lekin buni qanday qilish kerakligi haqida bir nechta maslahat yoki fikrlar kerak.

Izoh: Sinfimizda olmagan vazifalarni ishlata olmayapman, sinfda biz faqat asosiy ko'chadan va satrlarni qildik.

2
oddiy usul: ikkita massivni yaratib, 26 ta yozuvni (a-z) tashkil qiladi. har ikkala satrda pastadir va ikkala qatorga "inventarizatsiya qilish" mumkin. Masalan, "Foobar" sizga a (1), b (1), f (1), o (2), r (1) beradi. keyin ikkala qatorga aylantiriladi va ikkita harflar noldan hisoblanmaydi.
qo'shib qo'ydi muallif Marc B, manba
set va set.intersection dan foydalaning
qo'shib qo'ydi muallif joaquin, manba
Iplarni yopayotganda, sonini numaralandırdınız ()?
qo'shib qo'ydi muallif TML, manba

5 javoblar

Qisqa versiya bu:

def gen1(listItem):
    returnValue = []
    for character in listItem:
        if character not in returnValue and character != " ":
            returnValue.append(character)
    return returnValue

st = "first string"
r1 = gen1(st)
st2 = "second string"
r2 = gen1(st2)

if len(st)> len(st2):
    print list(set(r1).intersection(r2))
else:
    print list(set(r2).intersection(r1))

Note: This is a pretty old post but since its got new activity,I posted my version.

1
qo'shib qo'ydi

You are only getting '2' because you're only going to look at 4 total characters out of ahahaha (because huhu, the shortest string, is only 4 characters long). Change your while loop to go over big_string instead, and then add (len(S2) > i) and to your two conditional tests; the last test performs an in, so it won't cause a problem with index length.

NB: All of the above implicitly assumes that len(S1) >= len(S2); that should be easy enough to ensure, using a conditional and an assignment, and it would simplify other parts of your code to do so. You can replace the first block entirely with something like:

if (len(S2) > len(S1)): (S2, S1) = (S1, S2)
big_string = len(S1)
short_string = len(S2)
0
qo'shib qo'ydi

multidict kabi ma'lumotlar tuzilishi kerak. Mening ma'lumotimga ko'ra, standart kutubxonada eng ko'p o'xshash ma'lumotlar tuzilishi taymeri dan reyting www.uz hisoblanadi.

Oddiy chastotalarni hisoblash uchun:

>>> from collections import Counter
>>> strings = ['cat', 'rat']
>>> counters = [Counter(s) for s in strings]
>>> sum((counters[0] & counters[1]).values())
2

Indeksni hisoblash bilan:

>>> counters = [Counter(zip(s, range(len(s)))) for s in strings]
>>> sum(counters[0] & counters[1].values())
2

ahahaha va huhu misollaringiz uchun 2 va 0 h but noto'g'ri pozitsiyalarda.

Ilgari konstruktsiyalardan foydalana olmaganingiz uchun faqatgina taymer -sahifalar bilan taqlid qilishingiz kerak.

  • 26 elementli qatorlarni yarating
  • Iplar ustidan ko'chadan o'tib, har bir harf uchun tegishli indeksni yangilang
  • Bir vaqtning o'zida ketma-ketliklar ustidan qayta o'ynang va tegishli indekslarning minimal miqdorlarini yig'ing.
0
qo'shib qo'ydi

Jadvallarni yoki ro'yxatlardan foydalana olmaganingiz uchun,

Ehtimol, har bir umumiy belgi bir var_string uchun, keyin sinash uchun qo'shishga harakat qiling agar yo'q bo'lsa, var_string: siz umumiy hisoblagichingizni oshirishdan oldin bir xil belgini bir necha marta hisoblamasligingiz kerak.

0
qo'shib qo'ydi

Buni boshqalardan birining ichidagi quyida keltirilgan tarzda ishlatish mumkin

int y=0;
for(i=0;i

Agar siz "ahahaha" va "huhu" ga kirsangiz, bu kod birinchi katta belgini oladi birinchi 'foor' loopga kirganda string 'a'. loop uchun ikkinchisiga kirganda    "h" kichik simvolning birinchi harfini oladi va ularni o'xshamaydi teng y yo'q emas. Keyingi qadamda esa, loop uchun ikkinchi o'rinda turadi loop uchun dastlabki holatda qoladi, shuning uchun u «a» va katta mag'lubiyatning birinchi xarakterini hisobga oladi 'u' kichik harfining ikkinchi harfiga nisbatan taqqoslaydi, chunki 'j' ham ko'paytiriladi  Bu holatda ikkalasi ham teng emas, y esa nolga teng. Y miqdori oshib boradi quyidagi holatlarda: -

  1. katta harflardagi ikkinchi harfni 'h' ikkinchi harfini va birinchi stringning kichik harfini solishtirganda y, y y = 1;
  2. katta harfli 'h' ning to'rtinchi harfini va birinchi stringning kichik harfini solishtirganda y, y y = 2;
  3. katta harfli 'h' ning oltinchi harfini va birinchi stringning kichik harfini solishtirganda y, y y = 3;

Yakuniy ishlab chiqarish 3-chi. Biz buni istaymiz.

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