පයිතන් හි ලැයිස්තු දෙකක් සංයුක්ත කරන්නේ කෙසේද?


2552

පයිතන් හි ලැයිස්තු දෙකක් සංයුක්ත කරන්නේ කෙසේද?

උදාහරණයක්:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

අපේක්ෂිත ප්‍රති come ලය:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

7
ඔබට සරලව එකතු කිරීමට අවශ්‍යද , නැතිනම් ලැයිස්තු දෙක පිළිවෙලට ඒකාබද්ධ කිරීමට ඔබට අවශ්‍යද ? [1,3,6] සහ [2,4,5] සඳහා ඔබ අපේක්ෂා කරන ප්‍රතිදානය කුමක්ද? උප ලැයිස්තු දෙකම දැනටමත් වර්ග කර ඇති බව අපට උපකල්පනය කළ හැකිද (ඔබේ උදාහරණයේ මෙන්)?
smci

1
... එසේම ලැයිස්තු වල අනුපිටපත් තිබේ නම් කුමක් කළ [1,2,5] and [2,4,5,6]යුතුද? අනුපිටපත් ඇතුළත් කිරීම, බැහැර කිරීම හෝ ගණන් නොගැනීම ඔබට අවශ්‍යද?
smci

Answers:


3937

+ඒවා ඒකාබද්ධ කිරීම සඳහා ඔබට ක්‍රියාකරු භාවිතා කළ හැකිය :

listone = [1,2,3]
listtwo = [4,5,6]

joinedlist = listone + listtwo

ප්‍රතිදානය:

>>> joinedlist
[1,2,3,4,5,6]

110
මෙය ලැයිස්තුගත කිරීමේ ගැඹුරු පිටපතක් නිර්මාණය කර ලැයිස්තුගත කිරීම් එකතු කරයිද?
ඩැනියෙල් එෆ්

153
An ඩැනියෙල් එය පළමු ලැයිස්තුවේ ඇති නොගැඹුරු පිටපතක් සහිත නව ලැයිස්තුවක් නිර්මාණය කරනු ඇති අතර දෙවන ලැයිස්තුවේ ඇති නොගැඹුරු පිටපතක් ද ඇත. ලැයිස්තු වල ගැඹුරු පිටපත් ලබා ගැනීම සඳහා copy.deepcopy භාවිතා කරන්න.
ඩැනියෙල් ජී

221
මෙහි තවත් ප්රයෝජනවත් විස්තර: listone += listtwoප්රතිඵලlistone == [1, 2, 3, 4, 5, 6]
rickcnagy

16
list br1ckb0t එම ලැයිස්තුවේ පෙන්වා ඇති දේ වෙනස් කරයිද? ඉතින්: list3 = listone listone+=listtwo ලැයිස්තු 3 ද වෙනස් වී තිබේද?
මයික්

11
එය ලැයිස්තුව 3 වෙනස් කරයි. කෙසේ වෙතත්, එය ගැටළුවක් නොවේ නම්, නව එකක් නිර්මාණය කරනවා වෙනුවට ලැයිස්තු දෙක එකතු කිරීම වඩාත් කියවිය හැකිය.
rickcnagy

323

ලැයිස්තු දෙකේම ඇති අයිතම භාවිතයෙන් සරලව පුනරාවර්තනය වන උත්පාදක යන්ත්රයක් නිර්මාණය කිරීමට ද හැකිය itertools.chain(). නව ලැයිස්තුවකට අයිතම පිටපත් නොකර සැකසීම සඳහා දාම ලැයිස්තු (හෝ ඕනෑම නැවත කළ හැකි) එකට සැකසීමට මෙය ඔබට ඉඩ දෙයි:

import itertools
for item in itertools.chain(listone, listtwo):
    # Do something with each list item

4
chainලැයිස්තු දෙකක් සඳහා මන්දගාමී පැත්තේ (නමුත් වැඩි වශයෙන් නොවේ), නමුත් බහුවිධ ලැයිස්තු දම්වැල් දැමීම සඳහා වේගවත්ම විසඳුම වේ (n >> 2).
cs95

what cs95 මන්දගාමී දේ සමඟ සසඳන විට?
මොබර්ග්

Ober මොබර්ග් ලැයිස්තුගත කිරීමේ වෙනත් ක්‍රම සමඟ සසඳන විට, යොමු කිරීම සඳහා කරුණාකර මෙහි මගේ මිණුම් සලකුණු බලන්න .
cs95

275

පයිතන් >= 3.5විකල්පය:[*l1, *l2]

PEP 448සඳහන් කළ යුතු පිළිගැනීම තුළින් තවත් විකල්පයක් හඳුන්වා දී ඇත .

අතිරේක ඉවත් කිරීම සාමාන්‍යකරණයන් ලෙස නම් කර ඇති PEP, සාමාන්‍යයෙන් *පයිතන්හි තරු ලකුණු කළ ප්‍රකාශනය භාවිතා කරන විට සමහර සින්ටැක්ටික් සීමාවන් අඩු කළේය; එය සමඟ, ලැයිස්තු දෙකකට සම්බන්ධ වීම (ඕනෑම නැවත කළ හැකි දේකට අදාළ වේ) දැන් කළ හැක්කේ:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> joined_list = [*l1, *l2]  # unpack both iterables in a list literal
>>> print(joined_list)
[1, 2, 3, 4, 5, 6]

මෙම ක්‍රියාකාරීත්වය පයිතන් සඳහා අර්ථ දක්වා ඇති අතර3.5 එය 3.xපවුලේ පෙර සංස්කරණ වලට ආපසු යවා නොමැත . සහාය නොදක්වන අනුවාද වල a SyntaxErrorමතු කිරීමට යන්නේ ය.

අනෙක් ප්‍රවේශයන් මෙන්ම, මෙයද අනුරූප ලැයිස්තුවල ඇති මූලද්‍රව්‍යවල නොගැඹුරු පිටපතක් ලෙස නිර්මාණය කරයි .


මෙම උඩු යටිකුරු මෙම ප්රවේශය සඳහා ඔබ ඇත්තටම එය ඉටු කිරීම සඳහා ලැයිස්තු අවශ්ය, iterable කරන්නේ ඕනෑම දෙයක් නැති බව ය. PEP හි සඳහන් පරිදි:

මෙම වැනි, ද ලැයිස්තුවට iterables කෘතියේ මෙසේ වඩාත් හොඳින් කියවිය හැකි ක්රමයක් ලෙස ප්රයෝජනවත් වේ my_list + list(my_tuple) + list(my_range)මේ නිසා, සමාන වන [*my_list, *my_tuple, *my_range].

එබැවින් එකතු කිරීම වර්ගය නොගැලපීම නිසා +මතු TypeErrorවේ:

l = [1, 2, 3]
r = range(4, 7)
res = l + r

පහත සඳහන් දෑ සිදු නොවේ:

res = [*l, *r]

මක්නිසාද යත්, එය මුලින්ම පුනරාවර්තනවල listඅන්තර්ගතය ඉවත් කර පසුව අන්තර්ගතයෙන් සරලව නිර්මාණය කරන බැවිනි.


2
නැවත සැකසිය හැකි වර්ග මත වැඩ කිරීම ඉවත් කිරීම සඳහා කදිම නිදසුනක් නම්, ඔබ සම්මුතිගත කරන එක් ලැයිස්තුවක් හරහා ඉරේටරයක් ​​ආපසු ලබා දෙන කාර්යයන් ය. උදාහරණයක් ලෙස, ඔබ සම්පාදනය කරන ලැයිස්තු වලින් එකක් ආපසු හැරවිය හැකිය : res = [*l1, *reversed(l2)]. reversedඅනුකාරකයක් ආපසු ලබා දෙන බැවින් , res = l1 + reversed(l2)දෝෂයක් ඇතිවේ .
alan

2
මෙය පයිතන්හි ශබ්දකෝෂ ඒකාබද්ධ කිරීමට සමාන බව සඳහන් කිරීම වටී. dict3 = {** dict1, ** dict2}. ශබ්ද කෝෂය අගුළු ඇරීමට අපි ** භාවිතා කරන බව සලකන්න.
කෙවින් එස්

216

අද්විතීය අගයන් ඒකාබද්ධ කරන ලද ලැයිස්තුවක් ලබා ගැනීමට ඔබට කට්ටල භාවිතා කළ හැකිය

mergedlist = list(set(listone + listtwo))

46
කෙසේ වෙතත්, ඔබ උනන්දුවක් දක්වන්නේ නම් එය අනුපිටපත් ද ඉවත් කරනු ඇති බව ඇත්තකි. ලැයිස්තු එකතු කිරීම මඟින් එය සිදු නොවේ.
metasoarous

1
එය කිරීමට සහ ඇණවුම් කිරීමේ තොරතුරු තබා ගැනීමට ඇති මාර්ගය කුමක්ද?
නටීම්

11
වඩා හොඳlistone + [x for x in listtwo if x not in listone]
නටීම්

8
+1 IMHO මෙය "ඒකාබද්ධ" (යුනියන්) ලැයිස්තු සඳහා නිවැරදි ක්‍රමය වන අතර "අනුමත" පිළිතුර මඟින් ලැයිස්තු ඒකාබද්ධ කිරීම / එකතු කරන්නේ කෙසේද යන්න විස්තර කරයි (
මල්ටිසෙට්

2
ආදාන අනුපිළිවෙල පවත්වා ගැනීම ගැන ඔබ සැලකිලිමත් වන්නේ නම්, එවිට import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))උපක්‍රමය කරනු ඇත.
සෙත්මෝර්ටන්

189

තවත් එකක අවසානයට list.extend()එකතු කිරීම සඳහා ඔබට මෙම ක්‍රමය භාවිතා කළ හැකිය list:

listone = [1,2,3]
listtwo = [4,5,6]

listone.extend(listtwo)

ඔබට මුල් ලැයිස්තුව නොවෙනස්ව තබා ගැනීමට අවශ්‍ය නම්, ඔබට නව listවස්තුවක් නිර්මාණය කළ හැකි අතර ඒ සඳහා extendලැයිස්තු දෙකම:

mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)

85

පයිතන් හි ලැයිස්තු දෙකක් සංයුක්ත කරන්නේ කෙසේද?

3.7 වන විට, මේවා පයිතන්හි ලැයිස්තු දෙකක් (හෝ වැඩි ගණනක්) සංයුක්ත කිරීම සඳහා වඩාත් ජනප්‍රිය ස්ටඩ්ලිබ් ක්‍රම වේ.

රූප විස්තරය මෙහි ඇතුළත් කරන්න

පාද සටහන්

  1. මෙය සාරාංශගත විසඳුමකි. නමුත් sumයුගල වශයෙන් මෝස්තරයක් සිදු කරයි, එයින් අදහස් වන්නේ මෙය එක් එක් පියවර සඳහා මතකය වෙන් කළ යුතු බැවින් මෙය චතුරස්රාකාර මෙහෙයුමක් බවයි. ඔබගේ ලැයිස්තු විශාල නම් භාවිතා නොකරන්න.

  2. බලන්න chain සහ chain.from_iterable ලියකියවිලි වලින්. ඔබට import itertoolsපළමුව අවශ්‍ය වනු ඇත . සංක්ෂිප්ත කිරීම මතකයේ රේඛීය වේ, එබැවින් කාර්ය සාධනය සහ අනුවාද අනුකූලතාව අනුව මෙය හොඳම වේ. chain.from_iterable2.6 දී හඳුන්වා දෙන ලදී.

  3. මෙම ක්‍රමය මඟින් අතිරේක ඇසුරුම්කරණ සාමාන්‍යකරණයන් (PEP 448) භාවිතා කරයි , නමුත් ඔබ එක් එක් ඒවා අතින් ඉවත් නොකරන්නේ නම් N ලැයිස්තු වලට සාමාන්‍යකරණය කළ නොහැක.

  4. a += bසහ a.extend(b)සියලු ප්‍රායෝගික අරමුණු සඳහා වැඩි හෝ අඩු සමාන වේ. +=ලැයිස්තුවකට කැඳවූ විට අභ්‍යන්තරව අමතනු ඇත list.__iadd__, එය පළමු ලැයිස්තුව දෙවනුව දක්වා විහිදේ.


කාර්ය සාධනය

2-ලැයිස්තු සම්මුතිය 1

රූප විස්තරය මෙහි ඇතුළත් කරන්න

මෙම ක්‍රම අතර එතරම් වෙනසක් නැති නමුත් ඒවා සියල්ලටම එකම සංකීර්ණ අනුපිළිවෙලක් (රේඛීය) ඇති බැවින් එය අර්ථවත් කරයි. ශෛලිය පිළිබඳ කාරණයක් හැරෙන්නට එකිනෙකාට වඩා කැමති වීමට විශේෂ හේතුවක් නැත.

N- ලැයිස්තු සම්මුතිය

රූප විස්තරය මෙහි ඇතුළත් කරන්න

Perfplot මොඩියුලය භාවිතයෙන් බිම් කොටස් ජනනය කර ඇත . කේතය, ඔබේ යොමු කිරීම සඳහා.

1. iadd( +=) සහ extendක්‍රම නිසි පරිදි ක්‍රියාත්මක වන බැවින් පරීක්ෂා කිරීමට පෙර සෑම අවස්ථාවකදීම පිටපතක් ජනනය කළ යුතුය. දේවල් සාධාරණව තබා ගැනීම සඳහා, සියලු ක්‍රම වම් පස ලැයිස්තුව සඳහා පූර්ව පිටපත් කිරීමේ පියවරක් ඇති අතර එය නොසලකා හැරිය හැකිය.


වෙනත් විසඳුම් පිළිබඳ අදහස්

  • ඩන්ඩර් ක්‍රමය list.__add__කෙලින්ම කිසිම ආකාරයකින්, හැඩයකින් හෝ ආකාරයකින් භාවිතා නොකරන්න . ඇත්ත වශයෙන්ම, ඩන්ඩර් ක්‍රම වලින් stay ත්ව සිටින්න, සහ operatorඒවා නිර්මාණය කර ඇති ආකාරයට ක්‍රියාකරුවන් සහ කාර්යයන් භාවිතා කරන්න . පයිතන් පරිස්සමින් අර්ථ නිරූපණය කර ඇති අතර ඒවා කෙලින්ම ඩන්ඩර් ලෙස හැඳින්වීමට වඩා සංකීර්ණ වේ. මෙන්න උදාහරණයක් . එබැවින්, සාරාංශ කිරීමට, a.__add__(b)=> BAD; a + b=> හොඳයි.

  • මෙහි සමහර පිළිතුරු reduce(operator.add, [a, b])යුගල වශයෙන් සංයුක්ත කිරීම සඳහා ඉදිරිපත් කරයි - මෙය sum([a, b], [])වඩා නරක වචන වලට සමාන වේ.

  • භාවිතා කරන ඕනෑම ක්‍රමයක් setඅනුපිටපත් අතහැර ඇණවුම නැති කරයි. ප්‍රවේශමෙන් භාවිතා කරන්න.

  • for i in b: a.append(i)a.extend(b)තනි ක්‍රියාකාරී ඇමතුමකට වඩා මුග්ධ හා වඩා මන්දගාමී වේ . appendලැයිස්තු සඳහා මතකය වෙන් කර වර්ධනය කරන අර්ථකථන නිසා මන්දගාමී වේ. සමාන සාකච්ඡාවක් සඳහා මෙහි බලන්න .

  • heapq.mergeක්‍රියා කරනු ඇත, නමුත් එහි භාවිත අවස්ථාව වන්නේ වර්ග කළ ලැයිස්තු රේඛීය වේලාවට ඒකාබද්ධ කිරීමයි. වෙනත් ඕනෑම අවස්ථාවක එය භාවිතා කිරීම ප්‍රති-රටාවකි.

  • yieldශ්‍රිතයක අඩංගු ලැයිස්තු මූලද්‍රව්‍ය පිළිගත හැකි ක්‍රමයකි, නමුත් chainමෙය වේගවත් හා වඩා හොඳ කරයි (එයට C හි කේත මාර්ගයක් ඇත, එබැවින් එය වේගවත් වේ).

  • operator.add(a, b)යනු පිළිගත හැකි ක්‍රියාකාරී වේ a + b. එහි භාවිත අවස්ථා ප්‍රධාන වශයෙන් ගතික ක්‍රම යැවීම සඳහා වේ. එසේ නොමැති නම්, මගේ මතය අනුවa + b කෙටි හා වඩා කියවිය හැකි දේට වැඩි කැමැත්තක් දක්වන්න . වයි.එම්.එම්.වී.


stackoverflow.com/q/36863404/125507 සඳහා පිළිතුරු සඳහා පරිපූර්ණ කුමන්ත්‍රණයක් භාවිතා කළ හැකිය (නොම්බා විසඳුම ඇතුළුව)
එන්ඩොලිත්

එන්ඩොලිත් ටිකක් වැඩ වලින් ගිලී ඇති නමුත් මම බැලූ බැල්මට මට චිපයක් දැමිය හැකිදැයි බලන්න. ටයි.
cs95

කාර්ය සාධනය නැණවත්, වේගවත්ම ක්‍රමය කුමක්ද? කරුණාකර කියන්න.
ගනේෂ්දේශ්මුක්

@ ගනේෂ්දේශ්මුක් ටීඑල්; ඩීආර් යනු ඒවා සියල්ලම හොඳයි. ඔබ තෝරාගන්නා දෙය බොහෝ දුරට විලාසිතාවකි. "There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style."විසඳුම් මගේ පිළිතුරෙහි ලැයිස්තුගත කර නැත, නැතහොත්" අදහස් "හි විවේචනය කර ඇත. භාවිතා නොකිරීමට මම නිර්දේශ කරමි.
cs95


51

මෙම ප්‍රශ්නය ලැයිස්තු දෙකකට සම්බන්ධ වීම ගැන කෙලින්ම අසයි. කෙසේ වෙතත්, ඔබ බොහෝ ලැයිස්තු වලට සම්බන්ධ වීමේ මාර්ගයක් සොයන විට පවා එය සෙවීමේ ඉතා ඉහළ මට්ටමක පවතී (ඔබ ශුන්‍ය ලැයිස්තු වලට සම්බන්ධ වන අවස්ථාව ද ඇතුළුව).

මම හිතන්නේ හොඳම විකල්පය ලැයිස්තු අවබෝධය භාවිතා කිරීමයි:

>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> [x for xs in a for x in xs]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

ඔබට ජනක යන්ත්‍රද සෑදිය හැකිය:

>>> map(str, (x for xs in a for x in xs))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

පැරණි පිළිතුර

මෙම වඩාත් පොදු ප්‍රවේශය සලකා බලන්න:

a = [[1,2,3], [4,5,6], [7,8,9]]
reduce(lambda c, x: c + x, a, [])

ප්‍රතිදානය කරයි:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

සටහන විට මේ නිවැරදිව ක්රියා aවේ []හෝ [[1,2,3]].

කෙසේ වෙතත්, මෙය වඩාත් කාර්යක්ෂමව කළ හැක්කේ itertools:

a = [[1,2,3], [4,5,6], [7,8,9]]
list(itertools.chain(*a))

ඔබට අවශ්‍ය නැති listනමුත් නැවත කළ හැකි දෙයක් නම්, අතහරින්න list().

යාවත්කාලීන කරන්න

අදහස් දැක්වීමේදී පැට්‍රික් කොලින්ස් විසින් යෝජනා කරන ලද විකල්පයද ඔබට ප්‍රයෝජනවත් විය හැකිය:

sum(a, [])

3
පයිතන් 3 සටහන: reduceදැන් පවතින functoolsබැවින් ඔබට එය මුලින්ම ආනයනය කිරීමට අවශ්‍ය වේ.
ඩිමිට්‍රිස් ෆසරකිස් හිල්යාඩ්

41

ඔබට පහත පරිදි +හෝ +=ක්‍රියාකරු භාවිතා කළ හැකිය :

a = [1, 2, 3]
b = [4, 5, 6]

c = a + b

හෝ:

c = []
a = [1, 2, 3]
b = [4, 5, 6]

c += (a + b)

එසේම, ඒකාබද්ධ කළ ලැයිස්තුවේ අගයන් අද්විතීය වීමට ඔබට අවශ්‍ය නම් ඔබට කළ හැක්කේ:

c = list(set(a + b))

අවසාන කොටසට අත්තනෝමතික ලෙස අයිතම නැවත ඇණවුම් කළ හැකිය. ඔබට ඇණවුම සුරැකීමට අවශ්‍ය නම්, CPython 3.6+ හි ඔබට කළ හැකියlist(dict.fromkeys(a + b))
බොරිස්

27

itertools.chainශ්‍රිතය විචල්‍ය තර්ක ගණනක් පිළිගන්නා බව සඳහන් කිරීම වටී :

>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f']
>>> [i for i in itertools.chain(l1, l2)]
['a', 'b', 'c']
>>> [i for i in itertools.chain(l1, l2, l3)]
['a', 'b', 'c', 'd', 'e', 'f']

පුනරාවර්තනය කළ හැකි (ටුපල්, ලැයිස්තුව, උත්පාදක යනාදිය) ආදානය නම්, from_iterableපන්ති ක්‍රමය භාවිතා කළ හැකිය:

>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']

22

පයිතන් 3.3+ සමඟින් ඔබට අස්වැන්න භාවිතා කළ හැකිය :

listone = [1,2,3]
listtwo = [4,5,6]

def merge(l1, l2):
    yield from l1
    yield from l2

>>> list(merge(listone, listtwo))
[1, 2, 3, 4, 5, 6]

නැතහොත්, ඔබට අත්තනෝමතික අනුකාරක සංඛ්‍යාවක් සඳහා සහාය වීමට අවශ්‍ය නම්:

def merge(*iters):
    for it in iters:
        yield from it

>>> list(merge(listone, listtwo, 'abcd', [20, 21, 22]))
[1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22]

itertools.chainඔබේම ශ්‍රිතය නිර්වචනය කරනවා වෙනුවට ඔබට එය භාවිතා කළ හැකිය (එය සමාන වේ).
බොරිස්

19

ලැයිස්තු දෙක වර්ග කළ ආකාරයෙන් ඒකාබද්ධ කිරීමට ඔබට අවශ්‍ය නම්, ඔබට පුස්තකාලයෙන් mergeශ්‍රිතය භාවිතා කළ හැකිය heapq.

from heapq import merge

a = [1, 2, 4]
b = [2, 4, 6, 7]

print list(merge(a, b))

15

ඔබට ප්ලස් ක්‍රියාකරු ( +) භාවිතා කළ නොහැකි නම් , ඔබට operatorආනයනය භාවිතා කළ හැකිය :

import operator

listone = [1,2,3]
listtwo = [4,5,6]

result = operator.add(listone, listtwo)
print(result)

>>> [1, 2, 3, 4, 5, 6]

විකල්පයක් ලෙස, ඔබට __add__ ඩන්ඩර් ශ්‍රිතය ද භාවිතා කළ හැකිය :

listone = [1,2,3]
listtwo = [4,5,6]

result = list.__add__(listone, listtwo)
print(result)

>>> [1, 2, 3, 4, 5, 6]

3
ඩන්ඩර්ස් අල්ලා ගැනීම සාමාන්‍යයෙන් හොඳම ප්‍රවේශය නොවේ. නම් +මේසය, භාවිතා වසා ඇත operator.add.
ඩිමිට්‍රිස් ෆසරකිස් හිල්යාඩ්

2
ප්ලස් ක්‍රියාකරු නොමැති වන්නේ ඇයි?
cs01

2
සාමාන්‍යයෙන් එය එසේ නොවේ :) නමුත් ඔබ සිතියම් ශ්‍රිතය සමඟ ලැයිස්තුගත කිරීමක් කරන්නේ නම් හෝ එකතු කිරීමේ ශ්‍රිතය විචල්‍යයක ගබඩා කිරීමට අවශ්‍ය නම්, ඔබට + භාවිතා කළ නොහැක.
jpihl

13

තවත් ලැයිස්තු සඳහා වඩාත් පොදු ක්‍රමයක් ලෙස ඔබට ඒවා ලැයිස්තුවක් තුළට දමා itertools.chain.from_iterable()1 ශ්‍රිතය භාවිතා කළ හැකිය. මෙම පිළිතුර මත පදනම්ව කැදැලි ලැයිස්තුවක් පැතලි කිරීම සඳහා හොඳම ක්‍රමය වේ:

>>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> import itertools
>>> list(itertools.chain.from_iterable(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

1. chain.from_iterable()පයිතන් 2.6 සහ ඊට පසුව ලබා ගත හැකි සටහන . වෙනත් අනුවාද වල, භාවිතා කරන්න chain(*l).


10

ඇණවුම් කරන ලද ලැයිස්තු දෙකක් සංකීර්ණ වර්ග කිරීමේ නීති සමඟ ඒකාබද්ධ කිරීමට ඔබට අවශ්‍ය නම්, පහත දැක්වෙන කේතය මෙන් ඔබට එය පෙරළීමට සිදුවේ (කියවීමේ හැකියාව සඳහා සරල වර්ග කිරීමේ රීතියක් භාවිතා කරමින් :-)).

list1 = [1,2,5]
list2 = [2,3,4]
newlist = []

while list1 and list2:
    if list1[0] == list2[0]:
        newlist.append(list1.pop(0))
        list2.pop(0)
    elif list1[0] < list2[0]:
        newlist.append(list1.pop(0))
    else:
        newlist.append(list2.pop(0))

if list1:
    newlist.extend(list1)
if list2:
    newlist.extend(list2)

assert(newlist == [1, 2, 3, 4, 5])

නැතහොත් භාවිතා කරන්න heapq.merge.
cs95

7

වස්තූන් append()මත අර්ථ දක්වා ඇති ක්‍රමය ඔබට භාවිතා කළ listහැකිය:

mergedlist =[]
for elem in listone:
    mergedlist.append(elem)
for elem in listtwo:
    mergedlist.append(elem)

9
ඔබ ප්‍රායෝගිකව කරන්නේ මෙය නම්, මෙය අනෙක් යෝජිත ක්‍රමවලට වඩා බෙහෙවින් මන්දගාමී වේ. stackoverflow.com/questions/17479361/…
රයන්

7
list(set(listone) | set(listtwo))

ඉහත කේතය, ඇණවුම ආරක්ෂා නොකරයි, එක් එක් ලැයිස්තුවෙන් අනුපිටපත් ඉවත් කරයි (නමුත් සංයුක්ත ලැයිස්තුවෙන් නොවේ)


6

බොහෝ දෙනා විසින් දැනටමත් පෙන්වා දී ඇති පරිදි, ලැයිස්තු දෙකටම එකම ප්‍රතිකාරයitertools.chain() යෙදීමට අවශ්‍ය නම් යා යුතු මාර්ගයයි . මගේ නඩුවේදී, එක් ලැයිස්තුවකට වඩා අනෙක් ලැයිස්තුවට වෙනස් ලේබලයක් සහ ධජයක් මා සතුව තිබූ බැවින් මට තරමක් සංකීර්ණ යමක් අවශ්‍ය විය. පෙනෙන පරිදි, තිරය පිටුපස සරලවම පහත දේ කරයි:itertools.chain()

for it in iterables:
    for element in it:
        yield element

( https://docs.python.org/2/library/itertools.html බලන්න ), එබැවින් මම මෙතැන් සිට ආශ්වාදයක් ලබා ගෙන මෙම රේඛා ඔස්සේ යමක් ලිවීමි:

for iterable, header, flag in ( (newList, 'New', ''), (modList, 'Modified', '-f')):
    print header + ':'
    for path in iterable:
        [...]
        command = 'cp -r' if os.path.isdir(srcPath) else 'cp'
        print >> SCRIPT , command, flag, srcPath, mergedDirPath
        [...]

මෙහි දී වටහා ගත යුතු ප්‍රධාන කරුණු නම්, ලැයිස්තු යනු නැවත ලබා ගත හැකි විශේෂ අවස්ථාවක් පමණක් වන අතර ඒවා වෙනත් ඕනෑම වස්තුවක් වැනි ය; for ... inපයිතන් වල ඇති ලූප ටුපල් විචල්‍යයන් සමඟ ක්‍රියා කළ හැකි බැවින් එකවර බහුවිධ විචල්‍යයන් මත ලූප කිරීම පහසුය.


5

සරල ලැයිස්තු අවබෝධයක් භාවිතා කරන්න:

joined_list = [item for list_ in [list_one, list_two] for item in list_]

අතිරේක ඇසුරුම්කරණ සාමාන්‍යකරණයන් භාවිතා කිරීමේ නවතම ප්‍රවේශයේ සියලු වාසි එයට ඇත - එනම් ඔබට අත්තනෝමතික ලෙස විවිධ පුනරාවර්තන සංඛ්‍යාවක් (නිදසුනක් ලෙස ලැයිස්තු, ටුපල්, පරාස සහ ජනක යන්ත්‍ර) සංයුක්ත කළ හැකිය - එය පයිතන් 3.5 හෝ ඊට පසුව සීමා නොවේ. .


4

ලැයිස්තු ලැයිස්තුවක් ඒකාබද්ධ කිරීම සඳහා සැබවින්ම සංක්ෂිප්ත ක්‍රමයකි

list_of_lists = [[1,2,3], [4,5,6], [7,8,9]]
reduce(list.__add__, list_of_lists)

එය අපට ලබා දෙයි

[1, 2, 3, 4, 5, 6, 7, 8, 9]

කරුණාකර භාවිතා නොකරන්න list.__add__, operator.addඒ වෙනුවට භාවිතා කරන්න. මෙය වඩාත් sum(list_of_lists, [])නරක වචන වලට සමාන වේ . පාවිච්චි කරන්න එපා!
cs95

list cs95 ඔබට ලැයිස්තුව භාවිතා කිරීමෙන් ගැටලුව කුමක්දැයි පැහැදිලි කළ හැකිය .__ add__
ආකාෂ් සිං

ඩන්ඩර් ක්‍රම "පුද්ගලික ක්‍රම" වන අතර සාමාන්‍යයෙන් කෙලින්ම භාවිතා නොකළ යුතුය (ඒවා වෙනත් කාර්යයන් මගින් හැඳින්වේ). ව්යතිරේක යනු obj.__class__සහ obj.__dict__.
cs95

3

පයිතන්හිදී ඔබට මෙම විධානය සමඟ අනුකූල මානයන්හි අරා දෙකක් සංයුක්ත කළ හැකිය

numpy.concatenate([a,b])

4
ප්‍රශ්නය අංකයක් ඉල්ලන්නේ නැත.
cs95

2

එබැවින් පහසු ක්‍රම දෙකක් තිබේ.

  1. භාවිතා කිරීම+ : එය සපයා ඇති ලැයිස්තු වලින් නව ලැයිස්තුවක් නිර්මාණය කරයි

උදාහරණයක්:

In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: a + b
Out[3]: [1, 2, 3, 4, 5, 6]

In [4]: %timeit a + b
10000000 loops, best of 3: 126 ns per loop
  1. දිගුව භාවිතා කිරීම : එය පවතින ලැයිස්තුවට නව ලැයිස්තුවක් එක් කරයි. ඒ කියන්නේ එය වෙනම ලැයිස්තුවක් නිර්මාණය නොකරයි.

උදාහරණයක්:

In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: %timeit a.extend(b)
10000000 loops, best of 3: 91.1 ns per loop

මේ අනුව වඩාත් ජනප්‍රිය ක්‍රම දෙකෙන් extendකාර්යක්ෂම බව අපට පෙනේ .


2
මට + b + c + d + e වැනි බහු ලැයිස්තු එකතු කිරීමට අවශ්‍ය නම් කුමක් කළ යුතුද?
ට්වීකිම්ප්

2
WTweakimp විකල්ප කිහිපයක් ඇති මෙම පිළිතුර බලන්න (මම නිර්දේශ කරමි chain.from_iterable).
cs95

2

පයිතන් හි ලැයිස්තු සංයුක්ත කිරීමට විවිධ ක්‍රම තිබේ.

l1 = [1, 2, 3, 4]
l2 = [3, 4, 5, 6]
  1. new_list = l1.copy()
    new_list.extend(l2)

  2. new_list = l1 + l2

  3. new_list = [*l1, *l2]

1
කරුණාකර මෙම පිළිතුර අනෙක් අයට වඩා සපයන නව තොරතුරු මොනවාදැයි ඔබට පැහැදිලි කළ හැකිද?
cs95

1
පයිතන් හි ලැයිස්තු සංයුක්ත කිරීමට විවිධ ක්‍රම තිබේ - ඒවා සියල්ලම වෙනත් පැරණි පිළිතුරු වලින් පුළුල් ලෙස ආවරණය කර ඇත. මෙය සපයන නව තොරතුරු මොනවාද ??
ටොමරිකෝ

-1
import itertools

A = list(zip([1,3,5,7,9],[2,4,6,8,10]))
B = [1,3,5,7,9]+[2,4,6,8,10]
C = list(set([1,3,5,7,9] + [2,4,6,8,10]))

D = [1,3,5,7,9]
D.append([2,4,6,8,10])

E = [1,3,5,7,9]
E.extend([2,4,6,8,10])

F = []
for a in itertools.chain([1,3,5,7,9], [2,4,6,8,10]):
    F.append(a)


print ("A: " + str(A))
print ("B: " + str(B))
print ("C: " + str(C))
print ("D: " + str(D))
print ("E: " + str(E))
print ("F: " + str(F))

ප්‍රතිදානය:

A: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
B: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
C: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D: [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]]
E: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
F: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

-1

පැරණි ලැයිස්තු දෙක තබා ගනිමින් ඔබට නව ලැයිස්තුවක් අවශ්‍ය නම්:

def concatenate_list(listOne, listTwo):
    joinedList = []
    for i in listOne:
        joinedList.append(i)
    for j in listTwo:
        joinedList.append(j)

    sorted(joinedList)

    return joinedList

මින්ග්සියාඕගේ මෙම පිළිතුරට වඩා එය වෙනස් වන්නේ කෙසේද ?
ටොමරිකෝ

-2
lst1 = [1,2]

lst2 = [3,4]

def list_combinationer(Bushisms, are_funny):

    for item in lst1:
        lst2.append(item)
        lst1n2 = sorted(lst2)
        print lst1n2

list_combinationer(lst1, lst2)

[1,2,3,4]

4
හොඳයි, කරුණාකර යම් පැහැදිලි කිරීමක් කරන්න
U10-Forward

ඔබ එහි ඇති ගෝලීය නම් භාවිතා කරන්නේ නම් ශ්‍රිතයේ තර්කවල තේරුම කුමක්ද?
ටොමරිකෝ

-2

ඔබට කේතය අනුගමනය කළ හැකිය

listone = [1, 2, 3]
listtwo = [4, 5, 6]

for i in listone:
    listtwo.append(i)
print(listtwo)

[1,2,3,4,5,6]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.