.join () kutilmagan qatorni qaytaradi

from random import randint
roomTypes = ['T|', 'M|', 'W|', 'H|', 'C|']
dungeonLayout = ''
for i in range(1,10):
    dungeonLayout = dungeonLayout.join(roomTypes[randint(0, 4)])
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|')
print('_____________________________')
print('|' + dungeonLayout)
print('_____________________________')`

Mening kodim (bu yuqorida ko'rsatilgan) xonalarning tasodifiy ro'yxatini qaytarish, bu kabi ishlarni bajarish uchun mo'ljallangan bo'lsa-da, buning o'rniga xonalarni shunday formatlash mumkin:

|W|H|

u yozadi:

|WH||

Buning sababi shundaki, nima uchun men join buyrug'ini noto'g'ri ishlatsam bo'ladimi yoki butunlay boshqacha buyruq ishlatmoqchi bo'lsammi?

0
@jonrsharpe Men ko'r bo'lmagandim, lekin nima uchun OP kodi har bir harfdan keyin bo'sh kod bilan qo'shilsa va keyin ularni oxirigacha tashlab qo'ysa | ignore?
qo'shib qo'ydi muallif roganjosh, manba
@jonrsharpe Men javob beradigan narsalarning birortasi buni tushuntirayotganiga amin emasman. Birinchi qarashda, birlashishdan oldin dungeonLayout = '' , menga nima uchun ishlamaganligi mantiqsiz edi.
qo'shib qo'ydi muallif roganjosh, manba
Men sizni birinchi bor ta'kidlaganimdan keyin ko'rib turibman, nima uchun u ishlamayotganini tushuntirmaslik kerak bo'lgan javoblarning portlashi haqida gapiryapman.
qo'shib qo'ydi muallif roganjosh, manba
@Harvey, str.join nima qilganini hisobga olganda, bu o'rtacha bir taxmin kabi ko'rinmaydi. Masalan, masalan, ','. qo'shilish ('foo') - bu 'f, u, u' .
qo'shib qo'ydi muallif jonrsharpe, manba
@roganjosh bo'sh satr bilan qo'shilmaydi, 'ni ishlatib ' yordamida 'H |' ning barcha satrlariga qo'shiladi, HW || '. 'W |' .join ('abc') kodi 'aW | bW | c' berishi mumkin.
qo'shib qo'ydi muallif jonrsharpe, manba
@roganjosh ishni faqatgina print (dungeonLayout) bilan ishlating va bu aniq bo'lishi kerak. Har bir iteratsiya faqat ikkita yangi belgini mavjud magistral atrofida, har birining oxirida bitiradi.
qo'shib qo'ydi muallif jonrsharpe, manba
"W |" .join ("H |") nima qaytariladi?
qo'shib qo'ydi muallif Peter Wood, manba
@Harvey dungeon_layout = '|' + '|' .join (random.choice (room_types) ning diapazonida (10) uchun) + '|' ishi bormi?
qo'shib qo'ydi muallif jDo, manba
@roganjosh dungeonLayout har bir iteratsiyada o'zini o'zgartiradi, ya'ni keyingi iteratsiya va shuning uchun muammo emas, balki '' degan ma'noni anglatadi.
qo'shib qo'ydi muallif hashcode55, manba
'W |' .join ('H |') quyidagilarni bajaradi: argumentlardan elementlar ustidan yineleme, masalan. 'H |' mag'lubiyatini tashkil qiluvchi 'H' va '| ikkita elementni kiriting. 'V |' . Natija: 'HW ||' . "V |" "W | H |" funksiyasini qaytaradigan '+ H' '.
qo'shib qo'ydi muallif Luca Citi, manba
@PeterWood Men uni qaytarish uchun W | H | ni kutmoqdaman, lekin agar u yordam beradigan bo'lsa, u WH || ga qaytadi, agar u python 3.5.2 dan foydalansa
qo'shib qo'ydi muallif Harvey, manba
@jDo Bir oz modifikatsiya bilan, bu yuklarni tashkillashtiraman, qayerda qayerdaligimni ko'rdim, yana rahmat
qo'shib qo'ydi muallif Harvey, manba

10 javoblar

Buning sababi -

for i in range(1,10):
    dungeonLayout = dungeonLayout.join(roomTypes[randint(0, 4)])

Siz dungeonLayout kodini o'zgartirasiz va ro'yxatga qo'shilish uchun uni qayta ishlatasiz.

Nima qilishingiz kerak -

dungeonLayout = ''.join([roomTypes[randint(0, 4)] for _ in range(10)])
4
qo'shib qo'ydi
@Harvey Men javobni tahrir qildim.
qo'shib qo'ydi muallif hashcode55, manba
Ushbu turg'unlikni amalga oshirishning biron bir usuli mavjudmi, chunki men bu ma'lumotni keyinchalik dasturda foydalanish uchun saqlashni xohlayman.
qo'shib qo'ydi muallif Harvey, manba

join is described here https://docs.python.org/2/library/stdtypes.html#str.join and in summary you use the str as the glue between each elements in a given iterable.

Siz asosan "xona" ro'yxatini yaratmoqchi bo'lganingiz uchun tasodifiy xona turlarining ro'yxatini saqlash uchun randomRooms ro'yxatidan foydalanishingiz mumkin va keyin join join funksiyasidan foydalaning. uni kerakli formatda saqlang. Shuni esda tutingki, siz avval boshida va oxirida bir bo'lak qo'shishingiz kerak. Bu erda minimal kod bilan namuna siznikidan farq qiladi.

from random import randint
roomTypes = ['T', 'M', 'W', 'H', 'C']
randomRooms = []
for i in range(1,10):
    randomRooms.append(roomTypes[randint(0, 4)])
dungeonLayout = '|' + '|'.join(randomRooms) + '|'
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|')
print('_____________________________')
print(dungeonLayout)
print('_____________________________')

Also on https://eval.in/750197

2
qo'shib qo'ydi
dungeon_layout = '|' + ''.join(random.choice(room_types) for _ in range(15))

Yuqoridagi kod men qo'shgan loop o'rnini oladi va muammoni bartaraf qiladi va xona to'g'ri miqdorini qaytaradi, kredit @jDo'ga to'g'ri keladi, ko'p rahmat.

1
qo'shib qo'ydi
Ha, kodni o'zgartirishni unutgan edim: roomTypes = ['T |', 'M |', 'V |', 'H |', 'C |'] uchun room_types dungeon_layout = '|' deb yozganimdan oldin = ['T', 'M', 'V', 'H', 'S'] + '|' .join (random.choice (room_types) for _ ning range (10) uchun) + '|' ishlab chiqarilgan '| W | T | T | T | T | C | W | T | T | T | '. Yaxshiyamki, rahmat, ishimga xursandman :)
qo'shib qo'ydi muallif jDo, manba

my_str.join satrlari to'plamini oladi (ya'ni, iterable) va my_str bilan birga yapıştırılmış satrlarni qaytaradi, masalan.

"x".join(["1", "2", "3"])
# "1x2x3"

va, masalan,

"x".join("A|")
# Ax|

chunki A | "A" va "|" ning to'plamidir.

Siz loopni tuzatishingiz mumkin, ammo tushunchani ishlatish yaxshiroq:

"".join(roomTypes[randint(0,4)] for i in range(1,10))
0
qo'shib qo'ydi

Ning o'rniga

dungeonLayout = dungeonLayout.join (xona tiplari [randint (0, 4)])

ehtimol, ehtimol

dungeonLayout + = roomTypes [randint (0, 4)]

Sizning joriy kodingiz roomTypes'dan tasodifiy ikki belgigacha satrni tanlaydi, uni harflar ketma-ketligi sifatida ko'rib chiqadi va uni dungeonLayout o'zgarmaydigan bilan ajratuvchi sifatida qo'shing, shuning uchun natijada paydo bo'ladigan string someRoomType [0] + dungeonLayout + someRoomType [1] .

Bundan tashqari, siz "10 ta tasodifiy xona turini qabul qiling va ularni birga qo'shing" degan fikrni ifodalovchi quyidagi kod bilan to'liq 'for' loopini almashtirishingiz mumkin:

tasodifiy import tanlovlaridan dungeonLayout = '' .join (tanlovlar (xona tiplari, k = 10))

0
qo'shib qo'ydi

Bir necha variant ...

Eng sodda: + operatoridan har bir yangi xonani mag'lubiyatga birlashtirish uchun foydalaning:

dungeonLayout = dungeonLayout + roomTypes[randint(0, 4)]

Lekin siz haqsiz, birlashma() uslubi bunga biroz boshqacha ishlaydi. Bu dalillar satrlarni ketma-ketlikda bo'lishi kerak, va ularni ajratuvchi sifatida string yordamida birlashtiriladi.

separator = '|'
myList = ['1', '2', '3']
print(separator.join(myList))

beradi

1|2|3

Shunday qilib, sizning ishingizda ishtirok etish() ni ishlatish uchun:

from random import randint
roomTypes = ['T', 'M', 'W', 'H', 'C']
roomList = []
for i in range(1,10):
    roomList.append(roomTypes[randint(0, 4)])
dungeonLayout = '|'.join(roomList) + '|'
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|')
print('_____________________________')
print('|' + dungeonLayout)
print('_____________________________')

Umid qilamanki bu yordam!

0
qo'shib qo'ydi

Buning o'rniga foydalanishingiz mumkin:

dungeonLayout = dungeonLayout + roomTypes[randint(0,4)]

Bu "T | C | M | T | M | C | C | C | C |" ni ishlab chiqaradi. uslublar chiqishi.

0
qo'shib qo'ydi

Mana oling!

from random import randint
roomTypes = ['T|', 'M|', 'W|', 'H|', 'C|']
dungeonList = []
dungeonLayout = ""
for i in range(1,10):
    dungeonList.append(roomTypes[randint(0, 4)])

dungeonLayout = dungeonLayout.join(dungeonList)
print(dungeonLayout)
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|')
print('_____________________________')
print('|' + dungeonLayout)
print('_____________________________')

Har safar ishtirok etayotganingiz uchun, dastur chalkashib ketdi. Buning o'rniga men barcha ro'yxatlarni ro'yxatga qo'shdim va keyin bir marta qo'shildim. Agar siz bir narsani bir necha marotaba qo'shilsangiz, kompyuter xato qila boshlaydi

0
qo'shib qo'ydi

Juda oddiy tahrir qilish, faqatgina o'zgarish

dungeonLayout = dungeonLayout.join(roomTypes[randint(0, 4)])

uchun

dungeonLayout = dungeonLayout + roomTypes[randint(0, 4)]

Birlashtirishni ishlatish o'rniga + foydalaning Bu erda to'liq dastur

from random import randint
roomTypes = ['T|', 'M|', 'W|', 'H|', 'C|']
dungeonLayout = ''
for i in range(1,10):
    dungeonLayout = dungeonLayout + roomTypes[randint(0, 4)]
print('Room types are Temple |T|, Abandoned Military Base |M|, Wizard\'s Abodes |W|, House |H|, Church |C|')
print('_____________________________')
print('|' + dungeonLayout)
print('_____________________________')
rand1 = randint(0, 4)

Ex Chiqish: | T | W | M | M | W | M | C | H | T |

0
qo'shib qo'ydi

str.join ( iterable )

Qaytarilishi mumkin bo'lgan qaytariladigan qatoridagi birlashma bo'lgan satrni qaytaring. Elementlar orasidagi ajratuvchi bu usulni ta'minlovchi simodir.

src=https://docs.python.org/2/library/stdtypes.html#str.join

shuning uchun, tushuntirishdan. iterable da strings biriktirilishini qaytaradi.

Agar istalgan natijani xohlasangiz, quyidagilarni qiling:

dungeonLayout = dungeonLayout + xona tiplari [randint (0,4)]

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